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

2024-09-27 07:30:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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)

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

“调试的难度是当初编写代码的两倍。因此,如果你尽可能聪明地编写代码,你就没有足够的智慧去调试它”。-布莱恩·克尼汉


Tags: 代码textimportreformatlenreturndef
1条回答
网友
1楼 · 发布于 2024-09-27 07:30:44

这是一个三个运算符:format、regexp match和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周围添加()) 现在让我们来试试:

^{pr2}$

我们的regexp有两组(每个都在()):第一组是“任何非空白字符,重复四次”。我们可以看到它匹配'abcd'。第二组包含反向引用:match'\1'(无论组1匹配什么),重复两次。我们看到它匹配'abcdabcd'

总之,这与abcdabcdabcd匹配,并再次用'\1'替换,如我们之前所见,'abcd'。在

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

相关问题 更多 >

    热门问题