如何用Python正则匹配以#开头的字母数字子串?
正则提取以#开头的字母数字子串
需求:从文本test, test12, #test3, #test4 - : test555中提取所有以#开头、后续仅包含字母数字的子串,期望结果为['#test3', '#test4']。
之前尝试的正则存在的共性问题:
- 使用
.*(贪婪匹配)会过度匹配,从第一个#开始一直拉取到最后一个符合排除规则的字符,结果混入了多个目标子串和中间的无关符号 - 使用
.*?(非贪婪匹配)虽然会分段匹配,但会把目标子串后的非字母数字字符(比如逗号、空格)也包含进结果里
正确的正则表达式写法有两种,按需选择:
- 简洁写法(
\w匹配字母、数字、下划线,适合无下划线的场景):r"#\w+" - 精确写法(仅匹配字母和数字):
r"#[a-zA-Z\d]+"
代码示例:
import re text123 = "test, test12, #test3, #test4 - : test555" # 简洁写法输出 print(re.findall(r"#\w+", text123)) # 结果: ['#test3', '#test4'] # 精确写法输出 print(re.findall(r"#[a-zA-Z\d]+", text123)) # 结果: ['#test3', '#test4']
原理:+表示匹配前面的字符至少一次,\w或[a-zA-Z\d]精准限定了#之后的字符范围,匹配到第一个非字母数字字符时自动停止,刚好得到完整的目标子串。
内容的提问来源于stack exchange,提问作者Dmitrii
相关产品推荐
相关产品推荐

