• python正则模块re.findall的问题


    发现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)}]
  • 相关阅读:
    nyoj-68-三点顺序-计算几何
    zoj--1089--Lotto---DFS VS 暴力求解
    zoj----1090---The Circumference of the Circle---数学几何
    nyoj-阶乘0
    nyoj-回文字符串--动态规划
    nyoj-最长公共子序列---动态规划
    hdu-1285确定比赛名次---拓扑排序
    等式数量---hash算法
    学生学籍管理系统
    2020.2.9 解决Zabbix agent is not available&windows下安装zabbix-agent 主机部署监控
  • 原文地址:https://www.cnblogs.com/aaronhoo/p/13633986.html
Copyright © 2020-2023  润新知