You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用正则表达式(regex)识别紧邻指定关键词后的编号内容

问题修正方案

原代码存在多个逻辑问题导致匹配失败:

  1. 正则拼接逻辑错误,前缀字符串matchstring和关键词列表直接拼接,没有分组和分隔,匹配逻辑完全不符合预期
  2. Python re模块的后向断言要求固定匹配长度,你使用的关键词长度不统一,会直接触发匹配错误
  3. 编号匹配规则缺少量词,[\w\d-]仅能匹配单个字符,无法提取完整编号
  4. 没有处理关键词前后、前缀内部的可变空格、大小写差异等场景

可直接运行的修正代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 23:54:02