如何在正则表达式中使用变量

376 投票
11 回答
385849 浏览
提问于 2025-04-16 22:49

我想在正则表达式里面使用一个变量,这在Python中该怎么做呢?

TEXTO = sys.argv[1]

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

11 个回答

55
if re.search(r"\b(?<=\w)%s\b(?!\w)" % TEXTO, subject, re.IGNORECASE):

这段代码会把TEXTO里面的内容作为字符串插入到正则表达式中。

350

你需要把正则表达式写成一个字符串:

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,这样如果你的文本中有特殊字符,它们就不会被当作特殊字符来处理。

238

从Python 3.6开始,你可以使用一种叫做“字面字符串插值”的新特性,也就是“f-strings”。在你的具体情况下,解决方案是:

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

编辑:

由于评论中有一些关于如何处理特殊字符的问题,我想扩展一下我的回答:

原始字符串('r'):

在处理正则表达式中的特殊字符时,你需要理解一个主要概念,就是区分字符串字面量和正则表达式本身。这里有个很好的解释 在这里

简单来说:

假设你想匹配字符串 \boundary,而不是在 TEXTO 后面找到一个单词边界 \b。那么你需要写:

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

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

这之所以能工作,是因为我们使用了原始字符串(正则表达式前面有'r'),否则我们必须在正则表达式中写"\\\\boundary"(四个反斜杠)。另外,如果没有'\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-strings的正则表达式中使用量词,你需要使用双花括号。假设你想匹配后面跟着正好两个数字的 TEXTO

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

撰写回答