有没有办法可以找出Python中字符串中有多少正则表达式匹配?例如,如果我有字符串"It actually happened when it acted out of turn."
我想知道"t a"
字符串中出现了多少次.在该字符串中,"t a"
出现两次.我希望我的功能告诉我它出现了两次.这可能吗?
Sil*_*ost 43
import re
len(re.findall(pattern, string_to_search))
Run Code Online (Sandbox Code Playgroud)
Ale*_*lli 25
基于的现有解决方案findall
对于非重叠匹配是很好的(并且毫无疑问,除了可能用于大量匹配之外),尽管诸如sum(1 for m in re.finditer(thepattern, thestring))
(以避免在您关心的所有内容之前实现列表)等替代方案也很可能.有点特殊的是使用subn
和忽略结果字符串......:
def countnonoverlappingrematches(pattern, thestring):
return re.subn(pattern, '', thestring)[1]
Run Code Online (Sandbox Code Playgroud)
如果你只关心(比如说)多达100场比赛,那么后一种想法的唯一真正优势就来了; 然后,re.subn(pattern, '', thestring, 100)[1]
可能是实用的(返回100是否有100个匹配,或1000,或甚至更大的数字).
计算重叠匹配需要您编写更多代码,因为所讨论的内置函数都专注于非重叠匹配.还有定义的问题,例如,对于模式存在'a+'
和字符串存在'aa'
,你会认为这只是一个匹配,或者三个(第一个a
,第二个,它们两个),或者......?
假设您希望可能重叠的匹配从字符串中的不同位置开始(这将为前一段中的示例提供两个匹配):
def countoverlappingdistinct(pattern, thestring):
total = 0
start = 0
there = re.compile(pattern)
while True:
mo = there.search(thestring, start)
if mo is None: return total
total += 1
start = 1 + mo.start()
Run Code Online (Sandbox Code Playgroud)
请注意,在这种情况下,您必须将模式编译为RE对象:函数re.search
不接受start
参数(搜索的起始位置)方法的方式 search
,因此您必须切换字符串 - 当然比下一次搜索从下一个可能的不同起点开始更多的努力,这就是我在这个功能中所做的.
Nad*_*mli 14
我知道这是一个关于正则表达式的问题.我只是想如果有人想要一个非正则表达式解决方案,我会提到计数方法以供将来参考.
>>> s = "It actually happened when it acted out of turn."
>>> s.count('t a')
2
Run Code Online (Sandbox Code Playgroud)
其中返回子串的非重叠出现次数
您可以使用非捕获子模式找到重叠匹配:
def count_overlapping(pattern, string):
return len(re.findall("(?=%s)" % pattern, string))
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
43619 次 |
最近记录: |