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

Python正则表达式:提取两标识间字符串且不含标识本身

解决正则提取12cd和56gh之间内容的问题

嘿,我来帮你搞定这个正则提取的问题!你现在遇到的情况是,用re.findall(r'12cd.*56gh', a)提取时,结果会把12cd和56gh也包含进去,而且因为.*是贪婪匹配,还可能直接匹配从第一个12cd到最后一个56gh的整段内容,完全不符合预期。下面给你两种靠谱的解决方案:

方法一:使用捕获组(最直观)

我们可以用括号把想要提取的中间内容括起来,re.findall会自动返回捕获组里的内容,同时要把.*改成.*?(非贪婪匹配),这样它会匹配到最近的56gh就停止,而不是一直吃到最后一个。

示例代码:

import re
a = "12cdanfaw3i8hanjwofaef56ghah398hafadsf12cds;dkh38hfasdf56ghaldkshf12cdasdiuhf93f2asdf56gh"
# 用括号捕获12cd和56gh之间的内容,非贪婪匹配
result = re.findall(r'12cd(.*?)56gh', a)
print(result)
# 输出: ['anfaw3i8hanjwofaef', 's;dkh38hfasdf', 'asdiuhf93f2asdf']

方法二:使用零宽断言(无捕获组)

如果你不想用捕获组,可以用正则的零宽断言功能,它能匹配到符合前后条件的内容,但不会把前后的标识(12cd和56gh)包含进去:

  • (?<=12cd):反向预查,确保当前位置前面是12cd,但不包含它
  • (?=56gh):正向预查,确保当前位置后面是56gh,但不包含它

示例代码:

import re
a = "12cdanfaw3i8hanjwofaef56ghah398hafadsf12cds;dkh38hfasdf56ghaldkshf12cdasdiuhf93f2asdf56gh"
# 用零宽断言定位前后标识,提取中间内容
result = re.findall(r'(?<=12cd).*?(?=56gh)', a)
print(result)
# 输出同样是预期的三个字符串

两种方法都能完美得到你想要的结果,捕获组的写法更直观易懂,零宽断言则不需要依赖捕获组的返回逻辑,你可以根据自己的习惯选择~

内容的提问来源于stack exchange,提问作者Carol Ward

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:58:05