正则表达式、多个括号和方括号

tom*_*sen 1 python regex parentheses square-bracket python-3.x

来自@avinash-raj 的回答:

re.findall(r'\([^\[\]()]*\[\([^\[\]()]+source=([\w./]+)', s)
Run Code Online (Sandbox Code Playgroud)

修改后的问题:

我有以下字符串:

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)])]>'
Run Code Online (Sandbox Code Playgroud)

我想将此列表作为输出:

['x.gz','y.gz']
Run Code Online (Sandbox Code Playgroud)

原问题:

我有以下字符串:

s=string='s=<a=1 b=[([(source=x.gz i=0)]), ([(j=1 source=y.gz)])] c=[([(3)])]>'
Run Code Online (Sandbox Code Playgroud)

我想将此列表作为输出:

['x.gz','y.gz']
Run Code Online (Sandbox Code Playgroud)

我已经尝试过这个:

re.findall(r'b=\[([^]]*)\]',s)
Run Code Online (Sandbox Code Playgroud)

返回:

['([(source=x.gz i=0)']
Run Code Online (Sandbox Code Playgroud)

我也尝试过这个:

re.findall(r'\[([^]]*)\]',s)
Run Code Online (Sandbox Code Playgroud)

返回:

['([(source=x.gz i=0)', '(j=1 source=y.gz)', '([(3)']
Run Code Online (Sandbox Code Playgroud)

我同样很高兴得到一行答案或被指出教程,这使我能够在完成后自己找到答案。谢谢。

EDIT1:更改了字符串(参见下面的答案):

s=string='s=<a=1 b=[([(source=x.gz i=0)]), ([(j=1 source=y.gz)])] c=[([(3)])] source=4>'
Run Code Online (Sandbox Code Playgroud)

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)])]>'
Run Code Online (Sandbox Code Playgroud)

我试过这个:

re.findall(r'(?<=b=)\[\(.*?[\S]*?source=([\w\./]+)', s)
Run Code Online (Sandbox Code Playgroud)

但它只返回:

['x.gz']
Run Code Online (Sandbox Code Playgroud)

Avi*_*Raj 5

使用捕获组捕获要打印的字符。

>>> 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']
Run Code Online (Sandbox Code Playgroud)

解释:

  • \(\[\(按字面意思匹配([(字符。
  • [^\[\]()]*否定字符类,匹配任何字符,但不匹配[or](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']
Run Code Online (Sandbox Code Playgroud)