函数re.findall(), 让正则表达式匹配仅一个字符的字符串,为什么会匹配得到两个结果?

在交互式解释器中输入如下代码:
a = re.findall(‘(?<!h)’, ‘i’)
print(a)
运行结果为[‘’, ‘’],为什么?

讨论数量: 1
pardon110

(?<!…)
后视断定取非, 匹配当前位置之前不是 的子串。类似正向后视断定,包含的匹配...必须是定长。由断定成功’…`后,字符串搜索开始的位置进行匹配。

findall(pattern, string, flags=0)

findall 会返回匹配捕获到的不重复结果集,对于有多个子匹配捕获会呈现以元组列表形式展现结果。

(?<!h)
(换而言之 (?<!h)i 可以匹配捕获的i是指其前一位不是h的字符i,若仅仅(?<!h)只是要求断定前面不能有h字符,但未明匹配获对象,这种情况下自然为空。


>>> a=re.findall('(?<!h)i','i')
>>> print(a)
['i']
>>> a=re.findall('(?<!h)i','k')
>>> print(a)
[]
>>> a=re.findall('(?<!h)','h')
>>> print(a)
['']
>>> a=re.findall('(?<!h)','k')
>>> print(a)
['', '']
>>>

最后一种情况(?<!h)有断言(确定匹配点位置),但无匹配捕获对象, 换而言之被正则的源串有n个非h字符返回 n+1个",+1 是为全局正则结果为"

3年前 评论
lvsefandian (楼主) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!