Skip to main content
 首页 » 编程设计

python之正则表达式、多括号和方括号

2025年05月04日24powertoolsteam

@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']