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

如何使用Python提取字符串中所有Order ID后的订单号子串

提取邮件中所有Order ID对应订单号的实现方案

str.find() 方法本身设计就是返回第一个匹配项的索引,没有内置全局查找能力,所以只能拿到首个Order ID的位置。不需要改动你现有代码中已经定义的原始字符串、变量名和原有语法,直接替换匹配逻辑即可拿到全量结果,有两种常用实现方式:

  • 正则全局匹配(优先推荐,兼容性最强)
    用标准库re模块的findall()方法扫描整个原始邮件字符串,一次性返回所有匹配到的订单号,对不同分隔格式的适配成本最低。
  • 循环调用str.find()(适配不想引入正则的场景)
    通过不断更新查找起始位置的方式,遍历整个字符串拿到所有匹配点,再截取对应订单号,对格式一致性要求较高。

正则实现代码

import re

# 以下原有变量、原始邮件字符串全部保持你原来的写法即可,无需修改
raw_email = """
Order confirmation notice:
Order ID: ORD2405001
Delivered: Order ID : ORD2405072
Refund processed for Order ID - ORD2405129
"""

# 匹配规则:适配Order ID和订单号之间的空格、冒号、横杠等常见分隔符,捕获后续字母数字组成的订单号
pattern = r"Order ID\s*[:\-]?\s*([A-Z0-9]+)"
# 加re.IGNORECASE标志可以适配大小写不规范的写法,比如order id、ORDER ID
all_order_ids = re.findall(pattern, raw_email, flags=re.IGNORECASE)

print(all_order_ids)
# 输出: ['ORD2405001', 'ORD2405072', 'ORD2405129']

如果你的订单号包含短横线、下划线等特殊字符,只需要修改正则捕获组的匹配规则即可,比如支持短横线就把[A-Z0-9]+调整为[A-Z0-9\-]+。

基于str.find()的循环实现代码

如果你要保留原有str.find()的实现思路,可以通过移动查找指针的方式遍历所有匹配项:

all_order_ids = []
cursor = 0
keyword = "Order ID"

while True:
    # 从上次查找结束的位置继续往后匹配
    pos = raw_email.find(keyword, cursor)
    if pos == -1:
        # 没有更多匹配项时退出循环
        break
    # 跳过关键词本身的长度,定位到后续内容
    content_pos = pos + len(keyword)
    # 跳过中间的分隔符,截取到下一个空白字符前的内容作为订单号
    order_id = raw_email[content_pos:].strip().lstrip(":-").strip().split()[0]
    all_order_ids.append(order_id)
    # 更新游标位置,避免重复匹配同一段内容
    cursor = content_pos

print(all_order_ids)

注意:循环调用str.find()的方案需要严格对齐邮件里Order ID和订单号的分隔格式,如果出现特殊分隔符容易截取错误,生产环境优先选择正则实现。

内容的提问来源于stack exchange,提问作者jinal savaliya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 09:57:30