我想在正则表达式中使用一个变量,我如何在Python中做到这一点?
TEXTO = sys.argv[1]
if re.search(r"\b(?=\w)TEXTO\b(?!\w)", subject, re.IGNORECASE):
# Successful match
else:
# Match attempt failed
我想在正则表达式中使用一个变量,我如何在Python中做到这一点?
TEXTO = sys.argv[1]
if re.search(r"\b(?=\w)TEXTO\b(?!\w)", subject, re.IGNORECASE):
# Successful match
else:
# Match attempt failed
当前回答
你可以尝试使用格式语法sugarer的另一种用法:
re_genre = r'{}'.format(your_variable)
regex_pattern = re.compile(re_genre)
其他回答
rx = r'\b(?<=\w){0}\b(?!\w)'.format(TEXTO)
你也可以使用format关键字。Format方法会将{}占位符替换为您传递给Format方法作为参数的变量。
if re.search(r"\b(?=\w)**{}**\b(?!\w)".**format(TEXTO)**, subject, re.IGNORECASE):
# Successful match**strong text**
else:
# Match attempt failed
从python 3.6开始,你也可以使用文字字符串插值,“f-strings”。在你的具体情况下,解决方案是:
if re.search(rf"\b(?=\w){TEXTO}\b(?!\w)", subject, re.IGNORECASE):
...do something
编辑:
由于评论中有一些关于如何处理特殊字符的问题,我想扩展我的回答:
原始字符串('r'):
在处理正则表达式中的特殊字符时,您必须了解的一个主要概念是区分字符串字面量和正则表达式本身。这里有很好的解释:
简而言之:
让我们说,而不是在TEXTO后面找到一个单词boundary \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'将不再转换为单词边界,而是转换为退格!
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-字符串的正则表达式中使用量词,则必须使用双花括号。让我们假设你想匹配TEXTO后面恰好有2个数字:
if re.search(rf"\b(?=\w){re.escape(TEXTO)}\d{{2}}\b(?!\w)", subject, re.IGNORECASE):
print("match")
你可以尝试使用格式语法sugarer的另一种用法:
re_genre = r'{}'.format(your_variable)
regex_pattern = re.compile(re_genre)
if re.search(r"\b(?<=\w)%s\b(?!\w)" % TEXTO, subject, re.IGNORECASE):
这将把TEXTO中的内容作为字符串插入到正则表达式中。