找出正则表达式在Python中的字符串中匹配的次数

时间:2009-09-03 16:20:45

标签: python regex

有没有办法可以找出Python中字符串中正则表达式的匹配数?例如,如果我有字符串"It actually happened when it acted out of turn."

我想知道字符串中出现"t a"的次数。在该字符串中,"t a"出现两次。我希望我的功能告诉我它出现了两次。这可能吗?

8 个答案:

答案 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)