簡體   English   中英

是否有Perl相當於Python的re.findall / re.finditer(迭代正則表達式結果)?

[英]Is there a Perl equivalent of Python's re.findall/re.finditer (iterative regex results)?

在Python中,編譯的正則表達式模式有一個findall方法 ,它執行以下操作:

返回字符串中pattern的所有非重疊匹配,作為字符串列表。 從左到右掃描字符串,並按找到的順序返回匹配項。 如果模式中存在一個或多個組,則返回組列表; 如果模式有多個組,這將是一個元組列表。 結果中包含空匹配,除非它們觸及另一個匹配的開頭。

在Perl中執行此操作的規范方法是什么? 我能想到的一個天真的算法是“當搜索並用空字符串替換成功時,做[套件]”。 我希望有一個更好的方式。 :-)

提前致謝!

在匹配中使用/g修飾符。 perlop手冊:

/g ”修飾符指定全局模式匹配 - 即在字符串中盡可能多地匹配。 它的行為取決於上下文。 在列表上下文中,它返回正則表達式中任何捕獲括號匹配的子字符串列表。 如果沒有括號,則返回所有匹配字符串的列表,就好像整個模式周圍有圓括號一樣。

在標量上下文中,每次執行“ m//g ”都會找到下一個匹配項,如果匹配則返回true,如果沒有進一步匹配則返回false。 可以使用pos()函數讀取或設置最后一次匹配后的位置; perlfunc看到“ pos ”。 失敗的匹配通常會將搜索位置重置為字符串的開頭,但您可以通過添加“ /c ”修飾符(例如“ m//gc ”)來避免這種情況。 修改目標字符串也會重置搜索位置。

要建立對克里斯的反應,它可能是最相關包住//g正則表達式中的一個while循環,如:

my @matches;
while ( 'foobarbaz' =~ m/([aeiou])/g )
{
    push @matches, $1;
}

粘貼一些快速的Python I / O:

>>> import re
>>> re.findall(r'([aeiou])([nrs])','I had a sandwich for lunch')
[('a', 'n'), ('o', 'r'), ('u', 'n')]

為了在Perl中獲得類似的東西,構造可能是這樣的:

my $matches = [];
while ( 'I had a sandwich for lunch' =~ m/([aeiou])([nrs])/g )
{
    push @$matches, [$1,$2];
}

但總的來說,無論你迭代什么函數,你都可以在while循環中做。

@kyle的回答類似的內容很好的初學者參考: Perl教程:使用正則表達式

暫無
暫無

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

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