有没有办法可以找出Python中字符串中正则表达式的匹配数?例如,如果我有字符串"It actually happened when it acted out of turn."
我想知道字符串中出现"t a"
的次数。在该字符串中,"t a"
出现两次。我希望我的功能告诉我它出现了两次。这可能吗?
答案 0 :(得分:37)
import re
len(re.findall(pattern, string_to_search))
答案 1 :(得分:24)
基于findall
的现有解决方案适用于非重叠匹配(毫无疑问,除非可能是大量匹配),尽管sum(1 for m in re.finditer(thepattern, thestring))
等替代方案(以避免实现列表)当你关心的只是计数时)也很有可能。有点特殊的是使用subn
并忽略结果字符串......:
def countnonoverlappingrematches(pattern, thestring):
return re.subn(pattern, '', thestring)[1]
如果你只关心(比方说)多达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()
请注意,在这种情况下,您必须将模式编译为RE对象:函数re.search
不接受start
参数(搜索的起始位置)方法< / em> search
确实如此,所以你必须随时切换字符串 - 绝对比下一次搜索从下一个可能的不同起点开始更多的努力,这就是我正在做的事情这个功能。
答案 2 :(得分:12)
我知道这是关于正则表达式的问题。如果有人想要非正则表达式解决方案,我只是想提及count方法以供将来参考。
>>> s = "It actually happened when it acted out of turn."
>>> s.count('t a')
2
返回子串的非重叠出现次数
答案 3 :(得分:8)
您可以使用非捕获子模式找到重叠匹配:
def count_overlapping(pattern, string):
return len(re.findall("(?=%s)" % pattern, string))
答案 4 :(得分:7)
你试过这个吗?
len( pattern.findall(source) )
答案 5 :(得分:1)
import re
print len(re.findall(r'ab',u'ababababa'))
答案 6 :(得分:1)
为了避免创建匹配列表,可以使用re.sub作为替换密码。它将在每场比赛中被调用,增加内部计数器。
class Counter(object):
def __init__(self):
self.matched = 0
def __call__(self, matchobj):
self.matched += 1
counter = Counter()
re.sub(some_pattern, counter, text)
print counter.matched
答案 7 :(得分:0)
这很好
ptr_str = lambda pattern,string1 :print(f'pattern = {pattern} times = {len(re.findall(pattern,string1))}')
pattern = 'AGATC'
str='AAGGTAAGTTTAGAATATAAAAGGTGAGTTAAATAGATCATAGGTTATATTGT'
ptr_str(pattern,string1)