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

Dan*_*Dan 38 python regex

有没有办法可以找出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)

  • len(re.findall(pattern, string_to_search, re.IGNORECASE)) 如果您不想错过不同情况下的模式 (4认同)

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)

其中返回子串的非重叠出现次数


S.L*_*ott 8

你试过这个吗?

 len( pattern.findall(source) )
Run Code Online (Sandbox Code Playgroud)


Ant*_*sma 8

您可以使用非捕获子模式找到重叠匹配:

def count_overlapping(pattern, string):
    return len(re.findall("(?=%s)" % pattern, string))
Run Code Online (Sandbox Code Playgroud)