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

时间:2018-03-31 10:21:45

标签: python regex

我如何使用python re在字符串中查找target1target2,如下所示:

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

其中存在:

"aa.*(target).*bb"

但不喜欢:

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

我需要抓取以aa开头并以bb结尾的字符串部分。
这是一个想法(?<=aa((?!bb).)*?)(target\d)(?=.*bb)

但是,图案不能包含不固定的宽度搜索。

2 个答案:

答案 0 :(得分:0)

要获得target1target2,您可以使用正面的向后看和正向前瞻来获得aa和bb之间的部分。

抓住以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

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

(?<=aa)\.+(target\d)\.+(target\d)\.+(?=bb)

答案 1 :(得分:0)

您需要分两步执行此操作:1)从aabb之间提取aabb之间的子字符串aa((?:(?!aa).)*?)bb然后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 - aa子字符串
  • ((?:(?!aa).)*?) - 任何char,它不是aa char序列的起点,0或更多重复,尽可能少
  • bb - bb子字符串

target\d+模式只匹配target子字符串及其后的任何1位数。