Regex - группа без захвата не работает - PullRequest
1 голос
/ 12 апреля 2020

У меня есть несколько строк, например:

s = 'Albany To Westgate Via Riverhead'

Все строки имеют форму «X To Y Via Z» или «X To Y».

Я хочу извлечь Y, в примере "Westgate" из строк.

Я не могу просто сделать

re.match('\w+ To (w*) Via w*',s).group(1), потому что "Via" может или не может существовать ...

Например, я написал:

re.match('\w+ To (.+(?=\sVia .*$)?)',s).group(1), но это возвращает 'Westgate Riverhead', и я не понимаю, почему ~ что-то после via должно быть захвачено в группе 2 и не должен отображаться.

Кроме того, re.match('\w+ To (.+(?=\sVia .*$)?)',s).group(2) не возвращает ничего - что означает, что по какой-то причине группа 2 не соответствует чему-либо?

Любая помощь будет оценена

Ответы [ 3 ]

2 голосов
/ 12 апреля 2020

Это более обобщенное c регулярное выражение, которое позволяет адресатам иметь более одного слова и, возможно, также пунктуацию:

import re

regex = re.compile(r'.*?\s+to\s+(.+?)(?:\s+via\b.+)?$', re.I)

print(regex.match('Albany To Westgate Via Riverhead').group(1))
print(regex.match('New York to London').group(1))
print(regex.match('Barcelona to San Jose').group(1))
print(regex.match('New York to Los Angeles via St. Louis').group(1))

Вывод:

Westgate
London
San Jose
Los Angeles
0 голосов
/ 12 апреля 2020

Группы без захвата работают, если вы используете их правильно. В этом случае:

s = 'Albany To Westgate Via Riverhead'
r = re.match(r'(\w+) To (\w+)(?:\sVia (\w+)$)?',s)
# r.group(1) == 'Albany', r.group(2) == 'Westgate', r.group(3) == 'Riverhead'
0 голосов
/ 12 апреля 2020

Использование:

s = 'Albany To Westgate Via Riverhead'
mobj = re.search(r"^\w+\sTo\s(\w+)(?:\sVia\s\w+)?$", s)

Вы можете проверить регулярное выражение здесь .

Результат:

>>> print(mobj.group(1))

Westgate
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...