python正则模块re.findall的问题

博客探讨了Python re模块的findall方法在匹配过程中消耗已匹配字符的问题,并提供了一个递归搜索函数`recursive_search`作为解决方法,该函数能按预期返回所有匹配项。示例代码展示了如何正确匹配连续出现的数字和逗号。
摘要由CSDN通过智能技术生成

发现python的正则模块re的findall方法跟我预想的不太一样,它匹配的时候会消耗掉之前已经匹配到的字符,例如:

[In]:
import re
pat=',\d+,' #表示一个或以上整数前后都有一个逗号
text='1,2,3,4,5,6,7,'
[In]:
result=re.findall(pat,text)
print(result)
[Out]:
[',2,', ',4,', ',6,']

 理想中,应该2、3、4、5、6、7、都能匹配出来。

但上例中,实际执行的时候,2后面的逗号被取走(消耗掉)了,于是3不符合模式串,跳过,4前后都有逗号,匹配到,类似于3,5也被跳过,6匹配到。

如何得到我们希望的,从左到右扫描进行匹配时,已经匹配到的字符不被消耗?还没找到好办法,暂时只能用re.search()中设定pos参数值从文本的指定index开始进行匹配来解决了。

下面给出参考的代码:

def recursive_search(res,pat,text,pos=0):
    # 递归查找,避免re.findall()方法的缺点:
    # re.findall(',\d+,','1,2,3,4,5,6,7,')返回[',2,', ',4,', ',6,'],但希望返回[',2,',',3,',',4,',',5,',',6,',',7,']
    chars=[',','、',',','。','.']
    m=re.search(pat,text[pos:])
   # pos表示从text的哪个index开始匹配 if m: span=(m.span()[0]+pos,m.span()[1]+pos) res.append({'result':m.group(0),'span':span}) start_index=span[1] if pat[-1] in chars: start_index=span[1]-1 return recursive_search(res,pat,text,pos=start_index) else: return res

测试方法:

def test():
    pat=',\d+,'
    text='1,2,3,4,5,6,7,'
    res=[]
    res=recursive_search(res,pat,text)
    print(res)
输出:
[{'result': ',2,', 'span': (1, 4)}, {'result': ',3,', 'span': (3, 6)}, {'result': ',4,', 'span': (5, 8)},
{'result': ',5,', 'span': (7, 10)}, {'result': ',6,', 'span': (9, 12)}, {'result': ',7,', 'span': (11, 14)}]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值