使用正则表达式计算每个字符串的出现次数
Count number of occurences of each string using regex
给出这样的模式
pattern = re.compile(r'\b(A|B|C)\b')
和一个 huge_string
我想用字符串 D
替换与模式匹配的每个子字符串,并找到每个字符串 A
、B
的出现次数和 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
给出这样的模式
pattern = re.compile(r'\b(A|B|C)\b')
和一个 huge_string
我想用字符串 D
替换与模式匹配的每个子字符串,并找到每个字符串 A
、B
的出现次数和 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