如何使用正则表达式(regex)识别紧邻指定关键词后的编号内容
问题修正方案
原代码存在多个逻辑问题导致匹配失败:
- 正则拼接逻辑错误,前缀字符串
matchstring和关键词列表直接拼接,没有分组和分隔,匹配逻辑完全不符合预期 - Python re模块的后向断言要求固定匹配长度,你使用的关键词长度不统一,会直接触发匹配错误
- 编号匹配规则缺少量词,
[\w\d-]仅能匹配单个字符,无法提取完整编号 - 没有处理关键词前后、前缀内部的可变空格、大小写差异等场景
可直接运行的修正代码
import re # 适配前缀中间有无空格的场景,匹配Sales和Quote连写/带空格的所有情况 matchstring = r"Sales\s*Quote" x = """ Sentence1: Sales Quote number 36886DJ9 is entered Sentence2: SALES QUOTE No: 89745DFD is entered Sentence3: Sales Quote No : 7964KL is entered Sentence4: SALES QUOTE NUMBER:879654DF is entered Sentence5: salesquote no: 9874656LD is entered""" # 用捕获组替代后向断言,规避长度限制,同时自动处理大小写、空格、冒号问题 pattern = rf"{matchstring}\s*(?:no|number)\s*:?\s*([a-zA-Z0-9]+)" documentnumber = re.findall(pattern, x, flags=re.IGNORECASE) # 按期望格式输出 print(','.join(documentnumber))
运行输出
36886DJ9,89745DFD,7964KL,879654DF,9874656LD
正则逻辑说明
rf"{matchstring}"匹配指定前缀,配合re.IGNORECASE忽略大小写,\s*适配前缀内部有无空格的场景\s*匹配前缀和关键词之间的任意数量空格(?:no|number)非捕获组匹配两种关键词形式,忽略大小写适配no/No/NO/number/NUMBER等所有写法\s*:?\s*适配关键词后冒号前后有无空格的场景,不管是number、No:还是No :都可以正常匹配([a-zA-Z0-9]+)捕获组提取后续连续的字母数字组合,也就是你需要的编号
如果你需要保留原有的string_lst关键词列表写法,也可以调整为以下实现,效果完全一致:
import re matchstring = r"Sales\s*Quote" string_lst = ['number:', 'No:','no:','number','No : '] x = """ Sentence1: Sales Quote number 36886DJ9 is entered Sentence2: SALES QUOTE No: 89745DFD is entered Sentence3: Sales Quote No : 7964KL is entered Sentence4: SALES QUOTE NUMBER:879654DF is entered Sentence5: salesquote no: 9874656LD is entered""" # 对关键词做转义后拼接,避免特殊字符影响正则 keyword_pat = '|'.join(re.escape(k) for k in string_lst) pattern = rf"{matchstring}\s*(?:{keyword_pat})\s*([a-zA-Z0-9]+)" documentnumber = re.findall(pattern, x, flags=re.IGNORECASE) print(','.join(documentnumber))
内容的提问来源于stack exchange,提问作者user17040675
相关产品推荐
相关产品推荐

