@avinash-raj 的回答:
re.findall(r'\([^\[\]()]*\[\([^\[\]()]+source=([\w./]+)', s)
修改后的问题:
我有以下字符串:
s=string='s=<a=1 b=[(text1 [(text2 source=x.gz i=i.gz)]), ([(text3 j=1.0 source=y.gz)])] c=[([(3)])] d=[([(source=x.gz)])]>'
我想得到这个列表作为输出:
['x.gz','y.gz']
原始问题:
我有以下字符串:
s=string='s=<a=1 b=[([(source=x.gz i=0)]), ([(j=1 source=y.gz)])] c=[([(3)])]>'
我想得到这个列表作为输出:
['x.gz','y.gz']
我试过这个:
re.findall(r'b=\[([^]]*)\]',s)
哪个返回:
['([(source=x.gz i=0)']
我也试过这个:
re.findall(r'\[([^]]*)\]',s)
哪个返回:
['([(source=x.gz i=0)', '(j=1 source=y.gz)', '([(3)']
我同样很高兴得到一行答案或被指向一个教程,这使我能够在完成它后自己找到答案。谢谢。
EDIT1:更改字符串(见下面的答案):
s=string='s=<a=1 b=[([(source=x.gz i=0)]), ([(j=1 source=y.gz)])] c=[([(3)])] source=4>'
EDIT2:更改字符串(未提供答案,但我会自己提供):
s=string='s=<a=1 b=[(text1 [(text2 source=x.gz i=i.gz)]), ([(text3 j=1.0 source=y.gz)])] c=[([(3)])] d=[([(source=x.gz)])]>'
我试过这个:
re.findall(r'(?<=b=)\[\(.*?[\S]*?source=([\w\./]+)', s)
但它只返回:
['x.gz']
最佳答案
使用capturing groups捕获要打印的字符。
>>> string = 's=<a=1 b=[([(source=x.gz i=0)]), ([(j=1 source=y.gz)])] c=[([(3)])] source=4>'
>>> re.findall(r'\(\[\([^\[\]()]*source=([\w.]+)', string)
['x.gz', 'y.gz']
解释:
\(\[\(
按字面意思匹配([(
个字符。[^\[\]()]*
一个否定字符类,匹配任何字符但不匹配[
或]
或(
or)
零次或多次。source=
匹配字符串source=
([\w.]+)
一次或多次捕获单词字符或点。
更新:
>>> string = 's=<a=1 b=[(text1 [(text2 source=x.gz i=i.gz)]), ([(text3 j=1.0 source=y.gz)])] c=[([(3)])] d=[([(source=x.gz)])]>'
>>> re.findall(r'\([^\[\]()]*\[\([^\[\]()]+source=([\w.]+)', string)
['x.gz', 'y.gz']
关于python - 正则表达式、多括号和方括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26562831/