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

Ped*_*ito 201 python regex variables escaping python-3.x

我想在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
Run Code Online (Sandbox Code Playgroud)

Ned*_*der 263

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

TEXTO = sys.argv[1]
my_regex = r"\b(?=\w)" + re.escape(TEXTO) + r"\b(?!\w)"

if re.search(my_regex, subject, re.IGNORECASE):
    etc.
Run Code Online (Sandbox Code Playgroud)

请注意使用,re.escape以便如果您的文本具有特殊字符,则不会将其解释为此类字符.

  • 如果您的变量首先出现怎么办?'r''+ foo +'bar'`? (3认同)
  • 我不确定这是否适用于我需要有一组变量是其中的一部分。下面的其他答案看起来更直观,不要将正则表达式分成几个表达式。 (2认同)

小智 42

if re.search(r"\b(?<=\w)%s\b(?!\w)" % TEXTO, subject, re.IGNORECASE):
Run Code Online (Sandbox Code Playgroud)

这将把TEXTO中的内容作为字符串插入到正则表达式中.


Cat*_*lus 33

rx = r'\b(?<=\w){0}\b(?!\w)'.format(TEXTO)
Run Code Online (Sandbox Code Playgroud)

  • 如果我在正则表达式中使用 {4} 来表达我想要前面的 4 个,这不会有问题吗? (3认同)

air*_*rne 8

从python 3.6开始,您还可以使用文字字符串插值(“ f-strings”)。在您的特定情况下,解决方案是:

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

  • 截至 2020 年,这是在正则表达式中使用变量的最简单、最 Python 的方式 (7认同)
  • 这绝对是一个**哇**。 (5认同)
  • 如何在 f 字符串中编写量词: `fr"foo{{1,5}}"` (双大括号) (3认同)
  • 有人可以在这里解释“rf”的意义吗 (2认同)
  • @HarshaReddy:'r':这个字符串是一个原始字符串:如果你不使用它,'\b'将被转换为退格字符(https://docs.python.org/3/howto/regex)。 html#more-pattern-power)。'f' 告诉 python 这是一个 'f-string',s。上面的链接,使您能够将变量写入花括号中 - (2认同)

Max*_*oll 5

我同意以上所有内容,除非:

sys.argv[1] 就像 Chicken\d{2}-\d{2}An\s*important\s*anchor

sys.argv[1] = "Chicken\d{2}-\d{2}An\s*important\s*anchor"
Run Code Online (Sandbox Code Playgroud)

您不想使用re.escape,因为在这种情况下,您希望它表现得像一个正则表达式

TEXTO = sys.argv[1]

if re.search(r"\b(?<=\w)" + TEXTO + "\b(?!\w)", subject, re.IGNORECASE):
    # Successful match
else:
    # Match attempt failed
Run Code Online (Sandbox Code Playgroud)


小智 5

我发现通过将多个较小的模式串在一起来构建正则表达式模式非常方便。

import re

string = "begin:id1:tag:middl:id2:tag:id3:end"
re_str1 = r'(?<=(\S{5})):'
re_str2 = r'(id\d+):(?=tag:)'
re_pattern = re.compile(re_str1 + re_str2)
match = re_pattern.findall(string)
print(match)
Run Code Online (Sandbox Code Playgroud)

输出:

[('begin', 'id1'), ('middl', 'id2')]
Run Code Online (Sandbox Code Playgroud)