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

新手上路,请多包涵

我想在 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

原文由 Pedro Lobito 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

从 python 3.6 开始,您还可以使用 Literal String Interpolation ,“f-strings”。在您的特定情况下,解决方案是:

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

编辑:

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

原始字符串(’r’):

在处理正则表达式中的特殊字符时,您必须了解的主要概念之一是区分字符串文字和正则表达式本身。 这里 解释得很好:

简而言之:

假设您不想在 TEXTO \b ,而是要匹配字符串 \boundary 。你必须写:

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

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

这仅适用于我们使用的是原始字符串(正则表达式以 ‘r’ 开头),否则我们必须在正则表达式中写入“\\\boundary”(四个反斜杠)。此外,如果没有 ‘\r’,\b’ 将不再转换为单词边界,而是转换为退格!

转义

基本上在任何特殊字符前面放一个反斜杠。因此,如果您希望 TEXTO 中有一个特殊字符,则需要编写:

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

NOTE: For any version >= python 3.7: ! , " , % , ' , , , / , : , ; , < , = , > , @` 不会被转义。只有在正则表达式中有意义的特殊字符仍然被转义。 _ 自 Python 3.3 起未转义。(s. here

大括号:

如果要使用 f 字符串在正则表达式中使用量词,则必须使用双花括号。假设您要匹配 TEXTO 后跟 2 位数字:

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

原文由 airborne 发布,翻译遵循 CC BY-SA 4.0 许可协议

您必须将正则表达式构建为字符串:

 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 的使用,这样如果您的文本有特殊字符,它们就不会被这样解释。

原文由 Ned Batchelder 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题