Skip to main content
 首页 » 编程设计

python之如何使用正则表达式捕获值

2024年08月30日31zhengyun_ustc

我有这个字符串

circle,4.5 
square,3.1 
circle,2.0 
triangle,4.7,4.9 
square,4.1 
circle,4.3 

假设我想捕获形状的名称及其旁边的两个数字。我已经尝试过了,并将评论我在其中遇到的问题:

>>> ma = re.search(r"(\w+)[,(\d+.\d+)]+", "Triangle,3.4,1.2") 
>>> ma.group() 
'Triangle,3.4,1.2' 
>>> ma.group(1) 
'Triangle' 
>>> ma.group(2)  ##Why is this happening ??? 
Traceback (most recent call last): 
  File "<pyshell#29>", line 1, in <module> 
    ma.group(2) 
IndexError: no such group 

我想我不能将捕获组放在方括号内?

请您参考如下方法:

方括号比较特殊;他们将其中的所有字符标记为一个字符组。您要求匹配一个数字 (\d)、一个 , 逗号、一个 . 句号、一个 ( 左括号或 ) 右括号。换句话说,左括号和右括号是匹配字符的一部分,不表示捕获组。

您在这里根本不需要使用字符类,您正在寻找更具体的数字模式,后跟一个句点,然后是另一个数字。使用非捕获组 ((?:...)) 将数字格式与逗号组合在一起以匹配重复的数字组:

r"(\w+)(?:,(\d+.\d+))+" 

不幸的是,这仍然不会为您捕获多个组;正则表达式永远不会产生可变数量的组。我们在这里只定义了两个组,所以这就是我们得到的:

>>> import re 
>>> ma = re.search(r"(\w+)(?:,(\d+.\d+))+", "Triangle,3.4,1.2") 
>>> ma.groups() 
('Triangle', '1.2') 

参见 Regex question about parsing method signature和 python regex repetition with capture question对于遇到此限制的其他 SO 问题。

您的格式实际上非常简单,您最好不完全使用正则表达式。只需用 , 逗号分隔即可:

>>> "Triangle,3.4,1.2".split(',') 
['Triangle', '3.4', '1.2']