我有一个正则表达式,用(\ w {1,})替换字母n - 意思是任何单词都代表字母n。现在我想从(\ w {1,})的m个实例中创建一个组 - 即在(\w{1,})
的m个实例周围添加parens,如下所示:
"(" + "(\w{1,}), (\w{1,}), (\w{1,}) .... (\w{1,})" + ")", where (\w{1,}) occurs m times
我该怎么做?我知道它看起来大致像
re.sub(\w{1,}){2,}, inputstring, "(" + however many instances of (\w{1,}) the pattern was able to match + "))
如何在正则表达式中表达模式匹配m次? (这样我就可以进行替换,用括号括起来。)
答案 0 :(得分:1)
如果我正确理解了这个问题,那么你正在编写一个正则表达式来生成另一个正则表达式。也就是说,您正在使用正则表达式替换来构建正则表达式搜索的模式。您的输入包含某种通配符值(例如"n"
),您需要替换它以创建搜索模式。在搜索模式中,相邻的通配符值应合并为一个捕获组(因此"n n bacon n"
将提供两个捕获组,一个用于前两个单词,另一个用于最后一个单词。我认为如果您首先捕获所有相邻的通配符,然后替换较大组中的各个实例,则可以执行此操作。
这是执行此操作的代码:
import re
def make_pattern(template, wildcard="n"):
replacement_pattern = r"\b{0}\b(?:\s+{0}\b)*".format(wildcard)
def replacement_func(match):
return "(" + re.sub(wildcard, r"\w+", match.group()) + ")"
return re.sub(replacement_pattern, replacement_func, template)
\b
中的replacement_pattern
转义序列是必要的,以防止wildcard
出现"n"
如果它们是某个较大词的一部分(如"bacon"
at { replacement_func
)的结尾。闭包"n n n n"
使用额外的正则表达式替换来换出通配符,同时保留它们之间的间距(因此"n n n n"
之类的模板将与str.replace
不同。我想你可以做一个常规的字符串替换(用>>> make_pattern("n n bacon n")
'(\\w+\\s+\\w+) bacon (\\w+)'
>>> re.findall(make_pattern("n n bacon n"), "spam spam eggs bacon and spam")
[('spam eggs', 'and')]
),如果你愿意的话。在一个解决方案中,我无法抗拒三级复兴。
以下是一个示例运行:
{{1}}