[英]Why does re.findall() give me different results than re.finditer() in Python?
[英]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.