阅读python的re
包的文档后。我认为结果应该是re.sub('a*', '-', 'abxd',count=1) -> '-abxd'
。然而,我得到了以下结果:
re.sub('a*', '-', 'abxd',count=1) -> '-bxd'
这真的让我很困惑,因为第一个匹配应该是'abxd'
中'a'
前面的空匹配。
特别是,我尝试了其他三个例子,得到了如下预期结果:
re.sub('a*', '-', ' abxd',count=1) -> '- abxd'
re.sub('a*', '-', ' abxd',count=1) -> '- abxd'
re.sub('x*', '-', ' abxd',count=1) -> '-abxd'
我真的很感激你的帮助。
考虑findall
对示例的作用
>>> re.findall(r'(a*)', 'abcd')
['a', '', '', '', '']
五个匹配,第一个是最简单和最明显的:匹配a
。下一个是0或更多,在每个字符边界匹配:
for i in range(len(re.findall(r'a*', 'abcd'))):
s_sub=re.sub(r'a*', '-', 'abcd', count=i+1)
print(f' sub {i+1}: {s_sub}')
打印:
sub 1: -bcd
sub 2: --bcd
sub 3: --b-cd
sub 4: --b-c-d
sub 5: --b-c-d-
如果你仔细想想,这是正确的做法
如果你有re.sub('a*', '-', 'aaaabxd',count=1)
,你会期待吗:
- 将
-
插入字符串开头的字符边界以获得'-aaabxd'
或 - 在
a
之后获得'aaa-bxd'
或 - 你会期望
a*
意味着尽可能多的a来产生'-bxd'
吗
第三个选项是a*
:
>>> re.sub('a*', '-', 'aaaabxd',count=1)
'-bxd'
这种行为是量词*
变灰的结果。正则表达式语言中有一个元字符,当与+
或*
量词?
组合时,它会说不要贪婪,要LAZY。如果你使用它,它会导致你期望的行为,因为匹配所有a
的第一个明显匹配被跳过:
>>> re.sub('a*?', '-', 'aaaabxd',count=1)
'-aaaabxd'
和:
s='aabcd'
for i in range(len(re.findall(r'a*?', s))):
s_sub=re.sub(r'a*?', '-', s, count=i+1)
print(f'sub {i+1}: {s_sub}')
打印:
sub 1: -aabcd
sub 2: --abcd
sub 3: ---abcd
sub 4: ----bcd
sub 5: -----bcd
sub 6: -----b-cd
sub 7: -----b-c-d
sub 8: -----b-c-d-
a*
在当前位置匹配尽可能多的a
副本。它可以匹配零(与a+
不同(,但如果有,它将匹配所有这些。