You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修正正则表达式以匹配末段为非m辅音的连字符单词

修正连字符字符串匹配的正则表达式

需要匹配满足以下条件的连字符字符串:

  • 由一个或多个连字符分隔的字段组成(至少包含一个连字符)
  • 最后一个字段以除字母m外的辅音结尾

需排除:

  • 不含连字符的字符串
  • 最后一个字段以m或元音结尾的字符串

现有正则表达式在处理多连字符字符串时,会错误匹配长字符串的前缀部分(例如从cr-ca-cr-ca中错误匹配出cr-ca-cr)。


原测试代码

import re
dummy_data = """ 
broom  
br-oom
br-oo
crack
crack-l
crac-ken
crack-ed
cr-ca-cr-ca
cr-ca-cr-cr
cr-ca-cr-cr-cr
"""
pattern = r'\b(?:\w+-)+\w*[bcdfghjklnpqrstvwxyz](?<!m)\b'
final_consonant_hyphenated = [
    m.group(0)
    for m in re.finditer(pattern, dummy_data, flags=re.IGNORECASE)
]
print(final_consonant_hyphenated)

输出对比

错误输出

['crack-l', 'crac-ken', 'crack-ed', 'cr-ca-cr', 'cr-ca-cr-cr', 'cr-ca-cr-cr-cr']

预期输出

['crack-l', 'crac-ken', 'crack-ed', 'cr-ca-cr-cr', 'cr-ca-cr-cr-cr']

修正方案

修正后的正则表达式

问题根源是原正则会匹配长连字符字符串的前缀子串,需添加负向预查(?!-\w)确保匹配的字符串不是更长连字符字符串的一部分。修正后的正则:

r'\b(?:\w+-)+\w*[bcdfghjklnpqrstvwxyz](?<!m)\b(?!-\w)'

修正后的完整代码

import re
dummy_data = """ 
broom  
br-oom
br-oo
crack
crack-l
crac-ken
crack-ed
cr-ca-cr-ca
cr-ca-cr-cr
cr-ca-cr-cr-cr
"""
# 添加(?!-\w)避免匹配长连字符字符串的前缀
pattern = r'\b(?:\w+-)+\w*[bcdfghjklnpqrstvwxyz](?<!m)\b(?!-\w)'
final_consonant_hyphenated = [
    m.group(0)
    for m in re.finditer(pattern, dummy_data, flags=re.IGNORECASE)
]
print(final_consonant_hyphenated)

正则规则解释

  • \b:界定单词边界,确保匹配的是独立的完整单词
  • (?:\w+-)+:匹配一个或多个以连字符结尾的字段,保证字符串至少包含一个连字符
  • \w*[bcdfghjklnpqrstvwxyz]:匹配最后一个字段的内容,确保以除m外的辅音结尾
  • (?<!m):负向回顾断言,排除结尾辅音为m的情况
  • (?!-\w):负向预查断言,确保匹配的字符串结尾后不会跟着连字符和单词字符,避免错误匹配长连字符字符串的前缀子串

内容的提问来源于stack exchange,提问作者Paige Cox

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 15:43:18