【发布时间】:2013-04-20 14:07:15
【问题描述】:
对于findall 方法,是否存在与 BeautifulSoup 的 limit=X 参数等效的正则表达式?我的意思是,如何找到有问题的前 X 个单词然后中断代码执行?谢谢你
【问题讨论】:
标签: python regex python-2.7
对于findall 方法,是否存在与 BeautifulSoup 的 limit=X 参数等效的正则表达式?我的意思是,如何找到有问题的前 X 个单词然后中断代码执行?谢谢你
【问题讨论】:
标签: python regex python-2.7
使用re.finditer 和itertools.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 匹配时它不会中断
您可以使用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 功能。