如何编写正则匹配统计多形式oh my god短语并解决漏匹配问题
问题说明
需求为遍历文本文件,统计短语oh my god的出现次数,该短语存在多种书写变体,例如omg、oh-my-god、oh my god!等。
原有正则存在漏匹配问题,无法统计全部符合要求的匹配项,原代码如下:
regex = re.compile(r'\b(omg|(oh[^A-Za-z0-9]my[^A-Za-z0-9]god)')
问题原因
原有正则存在3个核心问题:
- 语法错误:模式串缺少闭合括号,直接运行会抛出语法异常
- 分隔符匹配逻辑错误:
[^A-Za-z0-9]要求oh和my、my和god之间必须存在恰好1个非字母数字字符,既无法匹配ohmygod这类无分隔符的连写形式,也无法匹配oh--my god这类多分隔符的形式 - 未配置大小写忽略规则,会漏掉
Oh My God、OMG这类大小写混合的写法
可用方案
调整正则匹配逻辑,允许词之间存在0个或多个非字母数字分隔符,开启不区分大小写匹配,修正语法错误,完整实现代码如下:
import re from pathlib import Path # 正则说明: # 1. \b 匹配单词边界,避免匹配到嵌入在长单词里的片段 # 2. (?:omg|oh[^a-z0-9]*my[^a-z0-9]*god) 非捕获分组,匹配两种核心形式:缩写omg、全拼oh my god(词之间允许0个或多个非字母数字分隔符,覆盖连写、连字符、多标点分隔等场景) # 3. re.IGNORECASE 开启不区分大小写匹配,覆盖各种大小写组合 count_pattern = re.compile(r'\b(?:omg|oh[^a-z0-9]*my[^a-z0-9]*god)\b', re.IGNORECASE) total_count = 0 # 替换为实际的文本文件路径 target_file = Path("target.txt") with open(target_file, 'r', encoding='utf-8') as f: for line in f: total_count += len(count_pattern.findall(line)) print(f"目标短语总出现次数:{total_count}")
该正则可以覆盖的常见变体包括但不限于:
- 缩写形式:
omg、OMG、Omg - 空格分隔:
oh my god、Oh My God - 符号分隔:
oh-my-god、oh.my.god、oh_my_god - 连写形式:
ohmygod、OhMyGod - 带尾部标点:
oh my god!、omg?、oh my god...
内容的提问来源于stack exchange,提问作者eshem
相关产品推荐
相关产品推荐

