>> re.findall("[^:]*", a) ['first', '', 'second', ''] -6ren">
gpt4 book ai didi

python - 为什么 re.findall() 比 re.sub() 找到更多的匹配项?

转载 作者:太空狗 更新时间:2023-10-29 16:57:29 29 4
gpt4 key购买 nike

考虑以下几点:

>>> import re
>>> a = "first:second"
>>> re.findall("[^:]*", a)
['first', '', 'second', '']
>>> re.sub("[^:]*", r"(\g<0>)", a)
'(first):(second)'

re.sub() 的行为最初更有意义,但我也能理解 re.findall() 的行为。毕竟,您可以匹配 first: 之间的空字符串,它只包含非冒号字符(恰好为零),但为什么 不是re.sub() 行为方式相同吗?

最后一个命令的结果不应该是(first)():(second)()吗?

最佳答案

您使用允许空匹配的 *:

'first'   -> matched
':' -> not in the character class but, as the pattern can be empty due
to the *, an empty string is matched -->''
'second' -> matched
'$' -> can contain an empty string before,
an empty string is matched -->''

引用documentation for re.findall() :

Empty matches are included in the result unless they touch the beginning of another match.

documentation for re.sub() 中解释了您在子结果中看不到空匹配项的原因:

Empty matches for the pattern are replaced only when not adjacent to a previous match.

试试这个:

re.sub('(?:Choucroute garnie)*', '#', 'ornithorynque') 

现在这个:

print re.sub('(?:nithorynque)*', '#', 'ornithorynque')

没有连续的#

关于python - 为什么 re.findall() 比 re.sub() 找到更多的匹配项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16371472/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com