2016-07-10 3 views
3

Привет, мир! У меня проблема с регулярным выражением. Я использую HTTP API (для поиска итальянских поездов), которые дают мне эти информации (например):Python regex? У меня проблемы

10911 - SESTO S. GIOVANNI|10911-S01325 

Формат:

TRAIN_NUMBER - STATION|TRAIN_NUMBER - STATION_CODE 

Пока не было несколько запросов все это нормально, потому что я требуется только одна информация, «S01325». Но когда пользователи начали расти, я обнаружил, что могут быть два поезда с одинаковой нумерацией. Например, поезд 612 может иметь два нумераций, на самом деле API дает мне:

612 - TARANTO|612-S11465 
612 - ASSO|612-N00079 

При (с помощью urllib.request модуля) Я пытаюсь прочитать это, я получаю:

b'612 - TARANTO|612-S11465\n612 - ASSO|612-N00079\n' 

I необходимо иметь два списка переменных:

A = ['612 - TARANTO', '612 - ASSO'] #First regex expression 
B = ['S11465', 'N00079'] #Second regex expression 

я должен использовать REGEX, правда? Я никогда не использовал REGEX, поэтому не знаю, что я должен делать. Я искал в Google и в Wiki (ы)/документах. Но я не нашел (404) решение этой проблемы. Очевидно, что регулярное выражение должно работает во всех случаях, например:

b'2097 - MILANO CENTRALE|2097-S01700\n' 

Дайте мне:

A = ['2097 - MILANO CENTRALE'] 
B = ['S01700'] 

Другой пример:

b'123 - ROMA TERMINI|123-S01358\n123 - TREVIGLIO|123-S01703\n' 

Дайте мне:

A = ['123 - ROMA TERMINI', '123 - TREVIGLIO'] 
B = ['S01358','S01703'] 

Спасибо, большое спасибо за re ADING. Надеюсь, я поняла. Иметь хороший день, Marco P.S .: Link to the italian docs

+0

вы пытались написать регулярное выражение? Если у вас есть, пожалуйста, добавьте его на свой вопрос, это облегчит вам помощь – Barnabus

+0

Что такое api? Я предполагаю, что есть хороший шанс, что вы можете получить данные в гораздо более удобном формате –

+0

@PadraicCunningham это единственный API, который работает. Да, я ненавижу. – MarcoBuster

ответ

4

На самом деле вам не нужны регулярные выражения. Вы можете использовать .Там это довольно простая модель в вашей информации:

<Train number> - <city>|<Train number>-<identifier> 

Итак, давайте посмотрим, что произойдет, если вы

>>> '123 - ROMA TERMINI|123-S01358'.split('|', 1) 
['123 - ROMA TERMINI', '123-S01358'] 

Так что теперь у вас есть первая часть того, что вы хотите. Вторая часть может быть зафиксирован с помощью что-то подобное, давайте посмотрим на

>>> '123-S01358'.split('-', 1) 
['123', 'S01358'] 

Так что вы можете сделать

>>> '123-S01358'.split('-', 1)[-1] 
'S01358' 

А ты молодец!

Если вы объедините все это вместе, вы должны получить ответ.

2

я должен использовать Regex, правда?

Неверно.

Я думаю, что лучшим решением является разбор каждой строки в токенах и назначение их разумным переменным. Вам нужно решение, которое меньше относится к примитивам строк и регулярному выражению; больше об объектах и ​​инкапсуляции.

Я бы разработал REST API, который позволил мне легко запросить для поездов и вернуть ответ в виде объектов JSON.

0

Во-первых, у вас есть convert your bytearrays to str objects.

С примерами вы обеспечили:

examples = [ 
    b'2097 - MILANO CENTRALE|2097-S01700\n', 
    b'123 - ROMA TERMINI|123-S01358\n', 
    b'123 - TREVIGLIO|123-S01703\n' 
] 

Если предположить, что формат является:

[TRAIN_NAME]|[TRAIN_NAME_REPEATED]-[TRAIN_NUMBER]\n 

Нам не нужно никаких регулярных выражений, мы можем просто разделить записи разделителей:

for example_bytes in examples: 
    example = example_bytes.decode("utf-8").split("|") 
    # example = ['2097 - MILANO CENTRALE', '2097-S01700\n'] 

    train_name = example[0] 
    # train_name = '2097 - MILANO CENTRALE' 

    train_number = example[1].split("-")[1] 
    # train_number = 'S01358' 

    A.append(train_name) 
    B.append(train_number.rstrip()) 

Затем посмотреть результат:

print(A) 
# ['2097 - MILANO CENTRALE', '123 - ROMA TERMINI', '123 - TREVIGLIO'] 
print(B) 
# ['S01700', 'S01358', 'S01703'] 

Если вы не хотите, чтобы ваши записи повторялись (если это вообще возможно), я предлагаю вам использовать sets вместо списков.

Проверьте документацию по API, вы зависите от формата она обеспечивает записи в

0

Вы действительно можете получить данные, которые вы хотите в формате JSON сделать правильный пост, для * Трено. - Stazione * используя код Rometta MESSINESE:

from pprint import pprint as pp 
import requests 
import datetime 

station = "S12049" 
dt = datetime.datetime.utcnow() 
arrival = "http://www.viaggiatreno.it/viaggiatrenonew/resteasy/viaggiatreno/arrivi/{station}/{iso}" 
with requests.Session() as s: 
    r = s.get(departure.format(station=station, iso=dt.strftime("%a %b %d %Y %H:%M:%S GMT+000 (UTC)"))) 
    pp(r.json()) 

И отъезд:

arrival = "http://www.viaggiatreno.it/viaggiatrenonew/resteasy/viaggiatreno/partenze/{station}/{iso}" 
with requests.Session() as s: 
    r = s.get(arrival.format(station=station, iso=dt.strftime("%a %b %d %Y %H:%M:%S GMT+000 (UTC)"))) 
    pp(r.json()) 
+0

Нет. Это прибытие станции. Мне нужна информация о поезде. Для этого мне нужны station_of_departure_id и train_number. Используя train_number и метод выше, я могу иметь идентификатор станции отправления. – MarcoBuster

+0

@MarcoBuster, это один из примеров, все данные запрашиваются с использованием ajax-запросов, где данные находятся в json-формате, все данные могут быть получены одинаково. Какой url вы использовали, чтобы получить поезд? –

+0

@MarcoBuster, я добавил как для прибытия, так и для вылета, который содержит всю информацию, которую вы видите на странице, и многое другое в формате json –