我如何使用python re在字符串中查找target1
和target2
,如下所示:
"aa.....target1...target2.....bb...target3...bb"
其中存在:
"aa.*(target).*bb"
但不喜欢:
"aa.* bb.*(target).*bb"
我需要抓取以aa
开头并以bb
结尾的字符串部分。
这是一个想法(?<=aa((?!bb).)*?)(target\d)(?=.*bb)
。
但是,图案不能包含不固定的宽度搜索。
答案 0 :(得分:0)
要获得target1
和target2
,您可以使用正面的向后看和正向前瞻来获得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("."))
如果在字符串中出现两次目标后跟数字,则可能会使用2个捕获组:
答案 1 :(得分:0)
您需要分两步执行此操作:1)从aa
和bb
之间提取aa
和bb
之间的子字符串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']
模式详情
aa
- aa
子字符串((?:(?!aa).)*?)
- 任何char,它不是aa
char序列的起点,0或更多重复,尽可能少bb
- bb
子字符串 target\d+
模式只匹配target
子字符串及其后的任何1位数。