使用正则表达式计算每个字符串的出现次数

Count number of occurences of each string using regex

给出这样的模式

pattern = re.compile(r'\b(A|B|C)\b')

和一个 huge_string 我想用字符串 D 替换与模式匹配的每个子字符串,并找到每个字符串 AB 的出现次数和 C。最可行的方法是什么?

一种方法是将每个字符串的模式拆分为 3 个模式,然后使用 subn

pattern_a = re.compile(r'\bA\b')
pattern_b = re.compile(r'\bB\b')
pattern_c = re.compile(r'\bC\b')
huge_string, no_a = re.subn(pattern_a, D, huge_string)
huge_string, no_b = re.subn(pattern_b, D, huge_string)
huge_string, no_c = re.subn(pattern_c, D, huge_string)

但它需要通过 huge_string 3 次。有没有更好的方法?

你可以分两次完成,第一次只是计算然后第二次做潜艇。这意味着如果您的搜索 space 增长为 a|b|c|d|e 等,您仍然只会进行 2 次传递,您的传递次数将不会基于您可能匹配的次数。

import re
from collections import Counter

string = " a j h s j a b c "
pattern = re.compile(r'\b(a|b|c)\b')
counts = Counter(pattern.findall(string))
string_update = pattern.sub('d', string)
print(counts, string, string_update, sep="\n")

输出

Counter({'a': 2, 'b': 1, 'c': 1})
 a j h s j a b c 
 d j h s j d d d 

您可以将可调用对象作为替换参数传递给 re.sub,并在单个替换过程中收集必要的计数详细信息:

import re

counter = {}

def repl(m):
    if m.group() in counter:
        counter[m.group()] += 1
    else:
        counter[m.group()] = 1
    return 'd'

text = "a;b o a;c a l l e d;a;c a b"
rx = re.compile(r'\b(a|b|c)\b')
result = rx.sub(repl, text)
print(counter, result, sep="\n")

Python demo online,输出;

{'a': 5, 'b': 2, 'c': 2}
d;d o d;d d l l e d;d;d d d