【问题标题】:How to limit regex's findall() method如何限制正则表达式的 findall() 方法
【发布时间】:2013-04-20 14:07:15
【问题描述】:

对于findall 方法,是否存在与 BeautifulSoup 的 limit=X 参数等效的正则表达式?我的意思是,如何找到有问题的前 X 个单词然后中断代码执行?谢谢你

【问题讨论】:

    标签: python regex python-2.7


    【解决方案1】:

    使用re.finditeritertools.islice

    from itertools import islice
    import re
    
    limit = 2
    
    for x in islice(re.finditer(r'\d+', '1 2 33'), limit):
        print(x.group())
    

    作为一个函数:

    def findall_limiter(pattern, string, flags=0):
        return islice(re.finditer(pattern, string, flags), limit)
    

    例如。

    for match in findall_limiter(r'\d+', '1 2 33', 2):
        # do stuff
    

    【讨论】:

    • 实际上这是更好的方法,因为当你没有 limit 匹配时它不会中断
    【解决方案2】:

    您可以使用re.finditer,因为它返回一个迭代器,而不是一次生成所有值:

    In [21]: strs="12345678"
    
    In [22]: it=re.finditer("\d",strs)
    
    In [23]: [next(it).group(0) for _ in xrange(4)] #returns only 4 mathces
    Out[23]: ['1', '2', '3', '4']
    

    虽然当限制大于匹配数时,这可能会引发StopIteration 错误。一个简单的解决方法是使用异常处理或使用itertools.isclice

    In [26]: def limiter(strs,pattern,limit):
        it=re.finditer(pattern,strs)
        try:
            for _ in xrange(limit):
                yield next(it).group(0)
        except StopIteration:        
            pass
       ....:     
    
    In [27]: list(limiter("12345","\d",3))
    Out[27]: ['1', '2', '3']
    
    In [28]: list(limiter("12345","\d",6))
    Out[28]: ['1', '2', '3', '4', '5']
    
    In [29]: list(limiter("12345","\d",10))
    Out[29]: ['1', '2', '3', '4', '5']
    

    关于re.finditer的帮助:

    In [24]: re.finditer?
    Type:       function
    String Form:<function finditer at 0xb74114c4>
    File:       /usr/lib/python2.7/re.py
    Definition: re.finditer(pattern, string, flags=0)
    Docstring:
    Return an iterator over all non-overlapping matches in the
    string.  For each match, the iterator returns a match object.
    
    Empty matches are included in the result.
    

    【讨论】:

    • .groups(),当您有多个组时。顺便说一句,如果您没有 limit 匹配项,则会中断
    • 感谢您的详细解释和limiter 功能。
    猜你喜欢
    • 1970-01-01
    • 2015-08-13
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    相关资源
    最近更新 更多