解释Python正则表达式中的嵌套花括号

时间:2018-02-03 03:57:34

标签: python nested string-formatting curly-braces

我在Kaggle内核中遇到了这个正则表达式,无法弄清楚它的作用:

import re
def substitute_repeats_fixed_len(text, nchars, ntimes=3):
    return re.sub(r"(\S{{{}}})(\1{{{},}})".format(nchars, ntimes-1), 
                  r"\1", text)

我一直在试验它,但发现它难以解释。

"调试的难度是首先编写代码的两倍。因此,如果您尽可能巧妙地编写代码,那么根据定义,您不够聪明,无法调试它"。 - Brian Kernighan

1 个答案:

答案 0 :(得分:0)

这是一个,格式化,正则表达式匹配和regexp替换中的三个运算符。要轻松理解它,将其写为:

import re
def substitute_repeats_fixed_len(text, nchars, ntimes=3):
    regexp = r"(\S{{{}}})(\1{{{},}})".format(nchars, ntimes-1)
    print "regexp:", regexp
    match = re.search(regexp, text)
    print "match groups:", match.groups()
    return re.sub(regexp, r"\1", text)

(这假定python2;如果你在python3上,则在print args周围添加()) 现在让我们试试吧:

>>> substitute_repeats_fixed_len("XYabcdabcdabcdZ", 4)
regexp: (\S{4})(\1{2,})
match groups: ('abcd', 'abcdabcd')
'XYabcdZ'

我们的正则表达式有两组(每组()):第一组是“任何非空白字符,重复四次。我们可以看到它与'abcd'匹配。第二组包含反向引用:匹配'\1'(无论组1匹配),重复两次。我们看到它匹配'abcdabcd'

这一次匹配abcdabcdabcd,然后再次使用'\1'替换,'abcd'正如我们之前看到的那样。

你可以问:但是第1组知道如何匹配abcd而不是XYab?这是你的正则魔法。 regexp引擎将尝试不同的匹配,直到找到可匹配整个字符串的匹配。

相关问题