Вопрос-Ответ

How to use a variable inside a regular expression

Как использовать переменную внутри регулярного выражения

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

TEXTO = sys.argv[1]

if re.search(r"\b(?=\w)TEXTO\b(?!\w)", subject, re.IGNORECASE):
# Successful match
else:
# Match attempt failed
Переведено автоматически
Ответ 1

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

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, чтобы, если в вашем тексте есть специальные символы, они не интерпретировались как таковые.

Ответ 2

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

if re.search(rf"\b(?=\w){TEXTO}\b(?!\w)", subject, re.IGNORECASE):
...do something

Редактировать:

Поскольку в комментарии было несколько вопросов о том, как обращаться со специальными символами, я хотел бы расширить свой ответ:

необработанные строки ('r'):

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

Вкратце:

Допустим, вместо поиска границы слова \b после TEXTO вы хотите сопоставить строку \boundary. Вы должны написать:

TEXTO = "Var"
subject = r"Var\boundary"

if re.search(rf"\b(?=\w){TEXTO}\\boundary(?!\w)", subject, re.IGNORECASE):
print("match")

Это работает только потому, что мы используем необработанную строку (регулярному выражению предшествует 'r'), в противном случае мы должны написать "\\\\ граница" в регулярном выражении (четыре обратных косых черты). Кроме того, без '\r' \b' преобразовался бы больше не в границу слова, а в пробел!

re.escape:

По сути, обратная косая черта ставится перед любым специальным символом. Следовательно, если вы ожидаете использовать специальный символ в TEXTO, вам нужно написать:

if re.search(rf"\b(?=\w){re.escape(TEXTO)}\b(?!\w)", subject, re.IGNORECASE):
print("match")

ПРИМЕЧАНИЕ: Для любой версии >= python 3.7: !, ", % ', , /, : ;, < =, > @, `,,, и,, не экранируются. В регулярном выражении по-прежнему экранируются только специальные символы, имеющие значение. _ не экранируется начиная с Python 3.3.(см. здесь)

Фигурные скобки:

Если вы хотите использовать кванторы внутри регулярного выражения с использованием f-строк, вам придется использовать двойные фигурные скобки. Допустим, вы хотите сопоставить TEXTO, за которым следуют ровно 2 цифры.:

if re.search(rf"\b(?=\w){re.escape(TEXTO)}\d{{2}}\b(?!\w)", subject, re.IGNORECASE):
print("match")
Ответ 3
if re.search(r"\b(?<=\w)%s\b(?!\w)" % TEXTO, subject, re.IGNORECASE):

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

Ответ 4
rx = r'\b(?<=\w){0}\b(?!\w)'.format(TEXTO)
2023-10-14 00:45 python regex python-3.x