Python正则匹配@开头独立词汇 如何解决前置空格、误匹配问题
Python匹配独立@开头词汇的正则方案
原有正则的问题
- 正则中直接写入了前置空白符匹配规则
\s,这部分内容会被纳入最终匹配结果,导致返回值携带多余前导空格 - 没有对匹配内容的前后边界做严格校验,会把嵌在连续字符串里的@片段误判为独立词汇
正确正则写法
使用零宽断言做边界判断,这类断言只校验位置规则、不会捕获对应字符,不会产生多余匹配内容:
import re regex = r'(?<!\S)@\/?[\w.-]{2,}(?!\S)'
规则说明
(?<!\S):负向后行断言,限制@符号的前一个位置不能是非空白字符,即@前面要么是字符串起始位置,要么是空白分隔符,不会捕获前置空白@\/?[\w.-]{2,}:保留原有核心匹配逻辑,匹配@开头、后续可跟可选斜杠、长度2位以上由字母/数字/下划线/点/横杠组成的内容(?!\S):负向前瞻断言,限制匹配内容的后一个位置不能是非空白字符,即匹配内容后面要么是字符串结束位置,要么是空白分隔符,可排除@dddada@snhfbjskjs这类连续非空白字符串里的非独立片段
效果验证
- 测试字符串1:
'george want@to play @.hdgska football @dddada'
执行re.findall(regex, exp)返回结果:['@.hdgska', '@dddada'],无多余前导空格 - 测试字符串2:
"george want@to play @.hdgska football @dddada@snhfbjskjs"
执行re.findall(regex, s)返回结果:['@.hdgska'],仅匹配独立出现的@词汇,排除嵌在连续字符串里的片段
内容的提问来源于stack exchange,提问作者John Angelopoulos
相关产品推荐
相关产品推荐

