У меня есть это регулярное выражение r'\b28\b'
. В этом выражении 28
должен быть динамическим. Другими словами, 28 — это динамическое значение, которое вводит пользователь. Таким образом, вместо 28 может быть 5. В этом случае выражение будет r'\b5\b'
.
Я попробовал два следующих подхода, но они не работают.
Я хочу знать, как я могу это сделать? Может кто-нибудь, пожалуйста, помогите мне с этим?
Вы можете использовать строку формата с 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']
@JLPeyret Он/она должен был использовать rf""
вместо f""
из-за этого \b
.
хе-хе. Я тоже списал rf"\b"
с них после того, как мой "\b"
провалился ;-)
Упс, исправлено. :)
В отличие от предыдущего ответа, обычно вы должны использовать 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()
.
Да, поэтому мое замечание о том, что прирост производительности не обязательно будет не таким уж полезным. Я думаю, что начал использовать re на версиях Python до того, как они были кэшированы. При ближайшем рассмотрении мой ответ похож на ответ Лдьера, за который я проголосовал. В основном потому, что я только сначала увидел str(number)
в этом ответе, прежде чем написать это.
который распечатал
[]
на Python 3.10 для меня.