如何编写正则表达式匹配含连续2个及以上相同辅音的单词
解决正则匹配连续相同辅音单词的问题
你的代码返回单个辅音而非目标单词,核心有两个问题:
re.findall在正则包含捕获组时,默认返回捕获组的匹配内容,而非整个单词;- 原正则的
\1仅匹配1次重复(即2个相同辅音),要覆盖2个及以上连续相同的情况,需要用\1+。
修正方案一:用re.finditer提取完整单词
finditer返回匹配对象的迭代器,通过match.group()可以直接获取整个匹配的单词:
import re xh_data = ("mmh tshhu itshu mama krrrr") matches = re.finditer(r'\b\w*([b-df-hj-np-tv-z])\1+\w*\b', xh_data, flags=re.IGNORECASE) onomat_consonant_words = [match.group() for match in matches] print(onomat_consonant_words) # 输出: ['mmh', 'tshhu', 'krrrr']
修正方案二:调整正则捕获结构
把整个单词作为外层捕获组,之后提取每组的第一个元素:
import re xh_data = ("mmh tshhu itshu mama krrrr") matches = re.findall(r'(\b\w*([b-df-hj-np-tv-z])\2+\w*\b)', xh_data, flags=re.IGNORECASE) onomat_consonant_words = [word[0] for word in matches] print(onomat_consonant_words) # 输出: ['mmh', 'tshhu', 'krrrr']
正则说明
\b:匹配单词边界,确保只提取完整单词\w*:匹配任意数量的前置/后置字母数字(包含元音)([b-df-hj-np-tv-z]):捕获单个辅音(排除a/e/i/o/u元音字母)\1+:匹配与捕获组相同的字符至少1次,实现“连续2个及以上相同辅音”的规则flags=re.IGNORECASE:忽略大小写,兼容大小写混合的场景(如果不需要可以删除)
内容的提问来源于stack exchange,提问作者Paige Cox
相关产品推荐
相关产品推荐

