Python正则表达式:忽略匹配前带有英文句点的情况
正则匹配解决方案
问题说明
需要匹配com-222这类格式(2-5个字母/数字/下划线 + 连字符 + 3位数字)的内容,但当目标内容前有英文句点(.)时不匹配。比如:
- 匹配:
5545com-222→ 提取com-222 - 不匹配:
5545.com-222
原正则\w{2,5}-\d{3}能匹配目标格式,但无法排除前置句点的情况,尝试[^\.]\w{2,5}-\d{3}无效。
修正后的正则表达式
使用负向零宽断言来排除前置句点的情况,正则表达式为:
(?<!\.)\w{2,5}-\d{3}
(?<!\.):负向零宽断言,确保当前位置的前一个字符不是英文句点(.)\w{2,5}-\d{3}:原匹配规则,匹配2-5个单词字符加连字符加3位数字
修改后的Python代码
import re, os, sys, shutil def getCode(file): # 加入负向零宽断言排除前置句点,保留忽略大小写规则 codeRegex = re.compile(r'(?<!\.)\w{2,5}-\d{3}', re.IGNORECASE) mo = codeRegex.search(str(file)) if mo: return mo.group() return False
补充说明
- 负向零宽断言
(?<!\.)不会消耗字符,只会检查前置条件,所以不会把匹配结果前面的无关字符(比如5545com-222里的5)包含进来 - 原代码中两次调用
search的逻辑可以优化为一次,提升执行效率
内容的提问来源于stack exchange,提问作者tachikoma01
相关产品推荐
相关产品推荐

