簡體   English   中英

在 Python 中找出字符串中正則表達式匹配的次數

[英]Find out how many times a regex matches in a string in Python

有沒有辦法可以找出 Python 字符串中正則表達式的匹配項數? 例如,如果我有字符串"It actually happened when it acted out of turn."

我想知道"ta"在字符串中出現了多少次。 在該字符串中, "ta"出現了兩次。 我希望我的函數告訴我它出現了兩次。 這可能嗎?

import re
len(re.findall(pattern, string_to_search))

基於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 個匹配項,還是 1000 個,甚至更大的數字,都返回 100)。

計算重疊匹配需要您編寫更多代碼,因為所討論的內置函數都專注於非重疊匹配。 還有一個定義問題,例如,模式為'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參數(搜索的起始位置),方法search的方式如此,因此您必須將字符串切片為你去 - 絕對比在下一個可能的不同起點開始下一次搜索更努力,這就是我在這個功能中所做的。

我知道這是一個關於正則表達式的問題。 我只是想如果有人想要非正則表達式解決方案,我會提到計數方法以供將來參考。

>>> s = "It actually happened when it acted out of turn."
>>> s.count('t a')
2

返回子串不重疊出現的次數

您可以使用非捕獲子模式查找重疊匹配項:

def count_overlapping(pattern, string):
    return len(re.findall("(?=%s)" % pattern, string))

你試過這個嗎?

 len( pattern.findall(source) )
import re
print len(re.findall(r'ab',u'ababababa'))

為了避免創建匹配列表,還可以使用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

這工作正常

ptr_str = lambda pattern,string1 :print(f'pattern = {pattern} times = {len(re.findall(pattern,string1))}')
pattern = 'AGATC'
str='AAGGTAAGTTTAGAATATAAAAGGTGAGTTAAATAGATCATAGGTTATATTGT'
ptr_str(pattern,string1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM