Python 正则表达式:为什么 re.sub('a*', '-', 'abxd',count=1) = '-bxd' ?不应该是"-abxd"吗?



阅读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),你会期待吗:

  1. -插入字符串开头的字符边界以获得'-aaabxd'
  2. a之后获得'aaa-bxd'
  3. 你会期望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+不同(,但如果有,它将匹配所有这些。

最新更新