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
相关产品推荐
相关产品推荐

