如何用Python正则捕获匹配项前至首个停用词的内容?
解决Python正则捕获数字及前方至首个停用词内容的问题
要实现捕获数字,同时获取数字前方至最近停用词(最多回溯10个词)的内容,核心是避免贪婪匹配过度,同时限制回溯的词数范围,以下是具体实现方案:
关键思路
- 用正则精准匹配停用词作为起始点
- 限制停用词到数字之间的词数最多为10个(含停用词),避免跨范围匹配
- 拆分出两个捕获组:一组是停用词到数字前的内容,另一组是目标数字
实现代码
import re string = 'bla bla, the document nr is 10101 where the other doc nr is 34454 with...' stopwords = ['a', 'an', 'the'] # 构建停用词正则:匹配任意停用词的单词边界 stopword_pattern = r'\b(?:{})\b'.format('|'.join(stopwords)) # 完整正则:捕获组1=停用词+最多9个后续词,捕获组2=目标数字 # (?:\W+\S+){0,9} 表示最多匹配9个"分隔符+词"组合,加上停用词共10个词 pattern = r'({}(?:\W+\S+){0,9})\W+(\b\d{1,5}\b)' # 遍历所有匹配结果 for idx, match in enumerate(re.finditer(pattern, string), 1): print(f"匹配{idx}:({match.group(1)}) ({match.group(2)})")
代码说明
- 停用词正则:用
\b(?:a|an|the)\b确保匹配完整的停用词(避免部分匹配,比如"there"里的"the"),非捕获组(?:...)用于组合选项,不生成额外分组。 - 词数限制:
(?:\W+\S+){0,9}限制停用词后最多跟随9个词(每个词前用非单词字符\W+作为分隔),加上停用词本身,总词数不超过10个,满足"最多回溯10个词"的需求。 - 捕获组拆分:第一个捕获组
(...)抓取停用词到数字前的完整内容,第二个捕获组(\b\d{1,5}\b)抓取目标数字。
输出结果
匹配1:(the document nr is) (10101) 匹配2:(the other doc nr is) (34454)
为什么之前的代码失败
你之前使用.*作为任意内容匹配,这是贪婪模式,会从第一个停用词一直匹配到最后一个数字,导致范围过大。改用限制词数的精准匹配后,能锁定每个数字最近的停用词范围。
内容的提问来源于stack exchange,提问作者JFerro
相关产品推荐
相关产品推荐

