re.findall соответствует только первому слову из скомпилированного списка в Python 3.6 - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть список названий городов, и я пытаюсь сопоставить имена в данной строке, используя python.например, моя строка -> '142 франка на кв. 125 Каньон Антилопы, Северная Дакота', где 'Крик Антилопы' = название города (из столбца города в Датафрейме) также есть город, называемый 'Антилопа' и 'Озеро Антилоп' '

Я использую метод re.findall, чтобы найти все совпадения.после выполнения следующего re.findall (re.compiled список городов, моя строка).он дает мне вывод только «Антилопа» вместо {«Антилопа»} {«Ручей Антилопы»} и {«Озеро Антилоп»}.Также, если я удалю «Антилопу» из скомпилированного списка.Он выводится как {'Antelope Creek'}, а не {'Antelope Creek'} и {'Antelope Lake'}.Кажется, что findall соответствует только первому слову.Пожалуйста, предложите мне любое решение, чтобы найти все совпадения, используя re.findall.Я приложу свой код ниже.

my string - '142 franc drive apt 125 Antelope Creek North Dakota' 
pattern = r'\b({0})\b'.format('|'.join(All_city_names.tolist()))
p = re.compile(pattern)
all_values = p.findall(my string)
cities = [tuple(j for j in i if j)[-1] for i in all_values] (%as it is a tuple format)

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Сами регулярные выражения выполняются слева направо.

Это означает, что если у вас есть список в группе чередований, то первое чередование
, которое соответствует, заставит двигатель пройти мимо группы чередований, а
продолжит попытки сопоставить оставшуюся частьрегулярное выражение

Если ваш список создает регулярное выражение, подобное этому \b(Antelope|Antelope Creek|Antelope Lake)\b

, вы можете видеть, что только Antelope когда-либо будет предоставлена ​​возможность дляматч.

Чтобы обойти это, вы должны отсортировать список в в порядке убывания до построения регулярного выражения
.

Выполнение этого приведет к следующему регулярному выражению:

\b(Antelope Lake|Antelope Creek|Antelope)\b

Поскольку самые длинные (отсортированные) подстроки находятся в начале, движок теперь имеет шанс совпасть с другимичередования.

0 голосов
/ 30 ноября 2018

Шаблон регулярного выражения, содержащий |, будет идти слева направо и останавливаться, как только будет соответствовать шаблону, игнорируя остальные.Если вы хотите сопоставить все города в вашем списке, вам нужно сопоставить их все по отдельности.

Простое частичное решение без регулярных выражений

all_values = [city for city in All_city_names.tolist() if city in my_string]

Немного более длинное решение регулярных выражений

all_values = [city for city in All_city_names.tolist() if re.search(r'\b' + re.escape(city) + r'\b', my_string)]
...