Как использовать переменную внутри регулярного выражения? - PullRequest
181 голосов
/ 03 августа 2011

Я хотел бы использовать variable внутри regex, как я могу сделать это в Python?

TEXTO = sys.argv[1]

if re.search(r"\b(?=\w)TEXTO\b(?!\w)", subject, re.IGNORECASE):
    # Successful match
else:
    # Match attempt failed

Ответы [ 9 ]

240 голосов
/ 03 августа 2011

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

TEXTO = sys.argv[1]
my_regex = r"\b(?=\w)" + re.escape(TEXTO) + r"\b(?!\w)"

if re.search(my_regex, subject, re.IGNORECASE):
    etc.

Обратите внимание на использование re.escape, так что если ваш текст содержит специальные символы, они не будут интерпретироваться как таковые.

40 голосов
/ 03 августа 2011
if re.search(r"\b(?<=\w)%s\b(?!\w)" % TEXTO, subject, re.IGNORECASE):

Это вставит то, что в TEXTO, в регулярное выражение в виде строки.

31 голосов
/ 03 августа 2011
rx = r'\b(?<=\w){0}\b(?!\w)'.format(TEXTO)
4 голосов
/ 03 февраля 2016

Мне очень удобно создавать шаблон регулярного выражения, объединяя несколько небольших шаблонов.

import re

string = "begin:id1:tag:middl:id2:tag:id3:end"
re_str1 = r'(?<=(\S{5})):'
re_str2 = r'(id\d+):(?=tag:)'
re_pattern = re.compile(re_str1 + re_str2)
match = re_pattern.findall(string)
print(match)

Вывод:

[('begin', 'id1'), ('middl', 'id2')]
3 голосов
/ 28 марта 2015

Я согласен со всем вышеперечисленным, если:

sys.argv[1] не был похож на Chicken\d{2}-\d{2}An\s*important\s*anchor

sys.argv[1] = "Chicken\d{2}-\d{2}An\s*important\s*anchor"

, вы не захотите использовать re.escape, потому что в этом случаехотел бы, чтобы он вел себя как регулярное выражение

TEXTO = sys.argv[1]

if re.search(r"\b(?<=\w)" + TEXTO + "\b(?!\w)", subject, re.IGNORECASE):
    # Successful match
else:
    # Match attempt failed
2 голосов
/ 23 апреля 2019

Начиная с версии Python 3.6 вы также можете использовать Интерполяция буквенных строк , "f-strings".В вашем конкретном случае решение будет:

if re.search(rf"\b(?=\w){TEXTO}\b(?!\w)", subject, re.IGNORECASE):
    ...do something
2 голосов
/ 23 октября 2015

Мне нужно было искать имена пользователей, которые похожи друг на друга, и то, что сказал Нед Бэтчелдер, было невероятно полезно. Тем не менее, я обнаружил, что у меня был более чистый вывод, когда я использовал re.compile для создания моего поискового запроса:

pattern = re.compile(r"("+username+".*):(.*?):(.*?):(.*?):(.*)"
matches = re.findall(pattern, lines)

Вывод может быть напечатан с использованием следующего:

print(matches[1]) # prints one whole matching line (in this case, the first line)
print(matches[1][3]) # prints the fourth character group (established with the parentheses in the regex statement) of the first line.
1 голос
/ 18 апреля 2019

Вы можете попробовать другое использование, используя format Граммер Suger:

re_genre = r'{}'.format(your_variable)
regex_pattern = re.compile(re_genre)  
0 голосов
/ 07 ноября 2018

Вы также можете использовать ключевое слово format для этого. Метод format заменяет {} местозаполнитель переменной, которую вы передали методу format в качестве аргумента.

if re.search(r"\b(?=\w)**{}**\b(?!\w)".**format(TEXTO)**, subject, re.IGNORECASE):
    # Successful match**strong text**
else:
    # Match attempt failed
...