使用Python正则表达式在固定的开始和结束模式中查找重复的目标

2024-10-06 08:41:18 发布

您现在位置:Python中文网/ 问答频道 /正文

如何使用python re在如下字符串中查找target1target2

"aa.....target1...target2.....bb...target3...bb"

其存在形式为:

"aa.*(target).*bb"

但不喜欢:

"aa.* bb.*(target).*bb"

我需要获取字符串中以aa开始并以bb结束的部分。
有个主意(?<=aa((?!bb).)*?)(target\d)(?=.*bb)。你知道吗

但是,模式不能包含非固定宽度搜索。你知道吗


Tags: 字符串retarget宽度模式形式主意aa
2条回答

您需要分两步完成:1)提取aabb之间没有aabb的子字符串,然后2)提取所有targetXXX子字符串:

import re
s="aa.....target1...target2.....bb...target3...bb"
m=re.search(r'aa((?:(?!aa).)*?)bb', s)
if m:
    print(re.findall(r"target\d+", m.group(1)))

# => ['target1', 'target2']

参见Python demo online。你知道吗

图案细节

  • aa-aaa子串
  • ((?:(?!aa).)*?)-任何字符,这不是aa字符序列的起点,0或更多重复,尽可能少
  • bb-a bb子串

^{}模式只匹配target子字符串及其后面的任何1+数字。你知道吗

为了得到target1target2,你可以使用一个积极的向后看和积极的向前看来得到aa和bb之间的部分。你知道吗

要抓住以aa开头以bb结尾的部分:

^{}

然后您可以在点上拆分并删除空匹配项:

regex = r"(?<=aa).*?(?=bb)"
test_str = "\"aa.....target1...target2.....bb...target3...bb\""
matches = re.findall(regex, test_str)
print filter(None, matches[0].split("."))

Test

如果字符串中出现两次后跟数字的目标,则可以使用两个捕获组:

^{}

相关问题 更多 >