我有这个字符串
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']
