Как динамически генерировать регулярное выражение в python?

У меня есть это регулярное выражение r'\b28\b'. В этом выражении 28 должен быть динамическим. Другими словами, 28 — это динамическое значение, которое вводит пользователь. Таким образом, вместо 28 может быть 5. В этом случае выражение будет r'\b5\b'.

Я попробовал два следующих подхода, но они не работают.

  1. r"r'\b" + номер_комнаты + r"\b'"
  2. "r'\b" + номер_комнаты + "\b'"

Я хочу знать, как я могу это сделать? Может кто-нибудь, пожалуйста, помогите мне с этим?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
62
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете использовать строку формата с re.escape, которая будет экранировать специальные символы:

import re

room_number = 5
reg_expr = rf"\b{re.escape(str(room_number))}\b"
re.findall(reg_expr, "Room 5 is the target room.")

Это выводит:

['5']

который распечатал [] на Python 3.10 для меня.

JL Peyret 11.11.2022 09:18

@JLPeyret Он/она должен был использовать rf"" вместо f"" из-за этого \b.

S.B 11.11.2022 09:30

хе-хе. Я тоже списал rf"\b" с них после того, как мой "\b" провалился ;-)

JL Peyret 11.11.2022 09:31

Упс, исправлено. :)

BrokenBenchmark 11.11.2022 18:11
Ответ принят как подходящий

В отличие от предыдущего ответа, обычно вы должны использовать r для строк регулярного выражения. Но как у вас было, r был внутри струн. Нужно выйти наружу. Это будет выглядеть так:

regex = r"\b" + str(my_var) + r"\b"

но в целом лучше использовать необработанные f-строки. Таким образом, вам не нужно самостоятельно преобразовывать int в str:

regex = rf"\b{my_var}\b"

Попробуйте запустить следующее, чтобы убедиться, что оно работает:

import re

str_to_match = '3 45 72 3 45'
my_var = 45

regex = rf"\b{my_var}\b"

for f in re.findall(regex, str_to_match):
    print(f)

Выходы:

45
45

Что ж, если вы похожи на меня, я всегда предварительно компилирую регулярные выражения.

(Не уверен, что это всегда значительно повышает производительность, но я просто считаю, что запоминать как скомпилированный, так и не скомпилированный синтаксис сложно, поэтому я выбрал только скомпилированный.)

Это решает вашу проблему с f-строками:

import re

data = """
Look for 28
Look for 42
"""

target = 28
patre = re.compile(rf"\b{target}\b")


for line in data.splitlines():
    if patre.search(line):
        print(line)

вывод:

Look for 28

Даже если re.compile нет, модуль re автоматически скомпилируется для нас. Он инкапсулирует функцию _compile().

Guf 11.11.2022 09:21

Да, поэтому мое замечание о том, что прирост производительности не обязательно будет не таким уж полезным. Я думаю, что начал использовать re на версиях Python до того, как они были кэшированы. При ближайшем рассмотрении мой ответ похож на ответ Лдьера, за который я проголосовал. В основном потому, что я только сначала увидел str(number) в этом ответе, прежде чем написать это.

JL Peyret 11.11.2022 09:25

Другие вопросы по теме