簡體   English   中英

findall()和使用for循環與迭代器查找模式匹配之間的區別是什么

[英]What's the difference between findall() and using a for loop with an iterator to find pattern matches

我用它來計算文本中的句子數量:

fileObj = codecs.open( "someText.txt", "r", "utf-8" )
shortText = fileObj.read()

pat = '[.]'

for match in re.finditer(pat, shortText, re.UNICODE):
    nSentences = nSentences+1

有人告訴我這更好:

result = re.findall(pat, shortText)
nSentences = len(result)

有區別嗎? 他們不做同樣的事情嗎?

第二個可能會快一點,因為迭代完全用C語言完成。速度快多少? 在我的測試中大約有15%(在'a' * 16匹配'a' ),盡管隨着正則表達式變得更復雜並占用更大比例的運行時間,該百分比將變小。 但它會使用更多內存,因為它實際上會為你創建一個列表。 假設你沒有大量的比賽,但沒有太多的記憶。

至於我更喜歡​​哪種,我有點像第二種簡潔,特別是當結合到一個聲明中時:

nSentences = len(re.findall(pat, shortText))

finditer函數返回匹配對象迭代器

findall函數返回匹配字符串列表

迭代器優於列表的優點是它們對內存友好(僅在需要時生成值)。

匹配對象優於字符串的優點是它們是通用的(為您提供組,分組,開始,結束,跨度等)。

選擇哪個最好取決於您的需求。 如果你需要一個匹配字符串列表,那么findall很棒。 如果您需要匹配對象方法或者您需要節省內存,那么finditer就是您的選擇。

希望這可以幫助。 祝你的項目好運:-)

他們做了很多相同的事情。 您的選擇應取決於您的其他用法是否表明迭代器或列表會更好。

finditerfindall之間的一個區別是前者返回正則表達式match objects而另一個返回組列表,如果模式中存在一個或多個組; 如果模式有多個list of tuples這將是一個list of tuples

除此之外,一切都取決於您的使用情況。

有兩個主要區別:

1) findall()返回一個列表,而finditer()返回一個迭代器。 如果你要處理大字符串(如文件),這可能是一個巨大的差異。

2) findall()返回str對象,而finditer()返回Match對象。 我認為這是主要的區別。 因此,根據您需要從匹配中獲得的信息,您可以選擇其中一個。 這是一個小例子:

我們想從字符串中獲取所有數字:

>>> s = 'I have 921 apples, 53 oranges, 3 bananas and 1 lemon.'
# if you just need to find them, better use findall():
>>> re.findall('\d+', s)
['921', '53', '3', '1']
# but, if you need more than just that, use finditer():
>>> [(m.group(), m.start(), m.end()) for m in re.finditer('\d+', s)]
[('921', 7, 10), ('53', 19, 21), ('3', 31, 32), ('1', 45, 46)]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM