我在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
答案 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引擎将尝试不同的匹配,直到找到可匹配整个字符串的匹配。