Как создать динамическое регулярное выражение в Python? - PullRequest
0 голосов
/ 21 ноября 2019

У меня работает цикл, который выбирает значения стран по одной из списка. Для текущей итерации, скажем, x_3 = "United Kingdom". Теперь я хочу найти x_3 в тексте txt_to_srch, помня, что "United Kingdom" может быть "United Kingdom" (более одного пробела) или "\ nUnited Kingdom \ n"в тексте. Слово t United Kingdom присутствует в txt_to_srch.

Я использовал следующий код:

x_3 = '\s+'.join(x_3.split(" "))
x_3 = r"\b" + re.escape(x_3)+r"\b"
x2 = re.compile(x_3,re.IGNORECASE)
txt_to_srch = re.sub(r'\n',' ',txt_to_srch)
txt_to_srch = re.sub(r'\r',' ',txt_to_srch)
txt_to_srch = re.sub(r'\t',' ',txt_to_srch)
y = re.findall(x2,txt_to_srch)

Однако я получаю y как пустой список.

1 Ответ

1 голос
/ 21 ноября 2019

Не используйте re.escape, который добавляет нежелательные обратные слеши:

re.escape (pattern)

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

Использование re.escape в вашем первом регулярном выражении превращает его в United\\s\+Kingdom, который попытается сопоставитьбуквально \, за которым следует s между United и Kingdom.

. Без него ваш код работает, как и ожидалось:

import re

x_3 = "United Kingdom"

txt_to_srch = """Monty Pythons come from United Kingdom. They do.
United Kingdom is their home. Yes.
United Kingdom"""

x_3 = '\s+'.join(x_3.split(" "))
x_3 = r"\b" + x_3 +r"\b"
# print(x_3)
# \bUnited\s+Kingdom\bx2 = re.compile(x_3,re.IGNORECASE)
txt_to_srch = re.sub(r'\n',' ',txt_to_srch)
txt_to_srch = re.sub(r'\r',' ',txt_to_srch)
txt_to_srch = re.sub(r'\t',' ',txt_to_srch)
y = re.findall(x2,txt_to_srch)

print(y)
# ['United Kingdom', 'United Kingdom', 'United Kingdom']
...