首页 > 解决方案 > 使用格式方法在 Python 中编辑正则表达式字符串

问题描述

.format()我想在 Python 中开发一个正则表达式,其中模式的一个组件在一个单独的变量中定义,并使用 Python 的string 方法即时组合成一个字符串。一个简化的例子将有助于澄清。我有一系列字符串,其中单词之间的空格可以用空格、下划线、连字符等表示。例如:

new referral
new-referal
new - referal
new_referral

我可以定义一个正则表达式字符串来匹配这些可能性:

space_sep = '[\s\-_]+'

(连字符被转义以确保它不会被解释为定义字符范围。)

我现在可以使用以下方法构建一个更大的正则表达式来匹配上面的字符串:

myRegexStr = "new{spc}referral".format(spc = space_sep)

这种方法对我来说的好处是我需要定义许多相当复杂的正则表达式,其中可能有几个不同的常见问题,这些问题会以不可预知的顺序多次出现;预先定义常用模式使正则表达式更易于阅读,并允许非常轻松地编辑字符串。

但是,如果我想使用{m,n}or{n}结构定义其他字符的出现次数,就会出现问题。例如,为了允许在“referral”的拼写中出现常见的拼写错误,我需要允许出现 1 或 2 次字母“r”。我可以编辑myRegexStr以下内容:

myRegexStr = "new{spc}refer{1,2}al".format(spc = space_sep)

但是,现在由于对花括号的使用感到困惑(无论是 aKeyError的情况{1,2}还是 的IndexError: tuple index out of range情况下的 an {n}),各种事情都会中断。

有没有办法使用.format()字符串方法来构建更长的正则表达式,同时仍然能够使用定义字符的出现次数{n,m}

标签: pythonregex

解决方案


{您可以将and加倍}来转义它们,或者您可以使用旧式字符串格式(%运算符):

my_regex = "new{spc}refer{{1,2}}al".format(spc="hello")
my_regex_old_style = "new%(spc)srefer{1,2}al" % {"spc": "hello"}

print(my_regex)           # newhellorefer{1,2}al
print(my_regex_old_style) # newhellorefer{1,2}al

推荐阅读