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

正则表达式匹配:提取双字符串间内容,无结束符时取至末尾

通用正则提取两个标记间内容(无结束标记则取到末尾)

嘿,这个需求其实用非贪婪匹配加上可选的结束标记就能一次性搞定,不用写两个分开的正则。我来给你拆解具体实现:

核心思路

要同时覆盖「有结束标记」和「无结束标记到末尾」两种场景,正则需要做到:

  1. 匹配到起始标记(比如示例里的foo=)之后,非贪婪地提取内容——避免贪婪匹配把后面的无关内容也吃掉;
  2. 把结束标记设置为「可选匹配」,如果没找到结束标记,就匹配到字符串末尾(用$表示)。

适配你需求的具体正则

针对提取foo=后面内容的场景,合并后的通用pattern是:

pattern = r'^.*foo=(.*?)(\sand|$)'

各部分解释:

  • ^.*foo=:匹配从字符串开头到foo=的所有内容(^表示起始,.*贪婪匹配到foo=为止);
  • (.*?):非贪婪提取foo=之后的内容,直到遇到后面的结束标记或者字符串末尾;
  • (\sand|$):匹配结束标记 and,如果没找到就匹配字符串末尾$,保证两种场景都能正确截断。

完整测试代码

用同一个pattern就能搞定你的两个示例场景:

import re

# 通用pattern,适配两种情况
pattern = r'^.*foo=(.*?)(\sand|$)'

# 场景1:存在结束标记"and"
s1 = 'quz=1, 2, 3 and foo=4, 5, 6 and bar=7, 8, 9'
m1 = re.match(pattern, s1)
assert m1.group(1) == '4, 5, 6'
print("场景1测试通过:", m1.group(1))

# 场景2:无结束标记,取到文本末尾
s2 = 'quz=1, 2, 3 and foo=4, 5, 6'
m2 = re.match(pattern, s2)
assert m2.group(1) == '4, 5, 6'
print("场景2测试通过:", m2.group(1))

通用模板(适配任意标记)

如果你的需求是提取任意起始标记START和结束标记END之间的内容,模板可以调整为:

# 假设起始标记是"START",结束标记是"END"
pattern = r'^.*START(.*?)(END|$)'
# 如果起始标记后面有符号(比如=),就改成:
# pattern = r'^.*START=(.*?)(END|$)'

注意:如果起始标记在文本中出现多次,可能需要调整前缀的匹配逻辑(比如去掉^.*,改用更精确的定位),但你的示例场景里用^.*是合适的。

内容的提问来源于stack exchange,提问作者Can Lu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:04:20