使用正则表达式对m组进行分组

时间:2014-06-27 04:38:03

标签: python regex

我有一个正则表达式,用(\ 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次? (这样我就可以进行替换,用括号括起来。)

1 个答案:

答案 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}}