Python 3正则表达式求助:如何匹配带数字的指定目标字符串
嘿,我来帮你理清这个正则的问题~首先先看你的需求:从字符串words = "qwe854345 bvc7321 kjd865"里匹配出qwe854345、bvc7321、kjd865这三个完整的词。
先分析你遇到的初始问题
你说一开始用\w匹配后续字母数字字符,但只得到了qwe、bvc、kjd,这大概率是因为你的正则写法没把“前缀+后续字符”作为一个整体匹配。比如如果只写了qwe|bvc|kjd,正则只会匹配这三个固定前缀;如果写了(qwe|bvc|kjd)\w(没加量词+),也只能匹配前缀加一个后续字符,而非所有后续数字。
说说你当前写法的小问题
你现在用results = re.findall('qwe+\w+|bvc+\w+|kjd+\w+')实现了需求,但这里有个冗余的地方:qwe+里的+是匹配前面的e重复1次或多次,而你要的是固定的qwe前缀,所以qwe+其实会匹配qwe、qwee、qweee这类,但你的字符串里前缀都是固定的三个字母,所以这里的+完全没必要,改成qwe\w+就够了。
更精准的正则写法
因为你的目标是“固定前缀+数字”,用\d(匹配数字)比\w(匹配字母数字下划线)更精准,推荐两种写法:
- 用分组简化重复的前缀(避免重复写相同规则):
import re words = "qwe854345 bvc7321 kjd865" # 非捕获组写法,只匹配完整目标词 results = re.findall(r'(?:qwe|bvc|kjd)\d+', words) # 或者直接拆分写,更直观 results = re.findall(r'qwe\d+|bvc\d+|kjd\d+', words)
这样就能精准匹配每个前缀后面跟着的所有数字,得到完整的qwe854345这类结果。
- 如果前缀都是三个小写字母,后面跟数字,也可以用更通用的写法:
results = re.findall(r'[a-z]{3}\d+', words)
当然这个写法适合前缀符合“三个小写字母”的场景,如果前缀只有指定的三个,还是用第一种更精准。
补充你可能的疑问点
你提到已经查了Python的HOWTO文档,可能还疑惑为什么\w一开始没生效?其实是因为正则默认是贪婪匹配,但前提是你要把前缀和后续字符的规则写完整。比如写qwe\w+,就会匹配qwe后面所有连续的字母数字,也就是完整的qwe854345,而如果只写qwe,自然只会匹配前缀啦。
内容的提问来源于stack exchange,提问作者Mr_Happy

