2

我有这个字符串

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

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

4

3 回答 3

1

使用.split(',')是最简单的方法,但是,如果你想使用正则表达式,那么你应该使用

ma = re.search(r"^([^,]+),([^,]+)(?:,([^,]+))?", "Triangle,3.4,1.2") 
于 2012-10-06T13:53:02.530 回答
1

方括号有特殊含义。它们旨在创建Character class.. 因此,如果您放在capture groups方括号内,则表示匹配group1 或 group2 或 group3 .. 它不会连续匹配所有组.. 您必须使用另一个capture group代替正方形括号..

但是,对于这种情况,您可以简单地使用 split :-

>>> str = "Triangle,3.4,1.2"
>>> str.split(",")
['Triangle', '3.4', '1.2']
>>> 
>>> str = "circle,4.5"
>>> str.split(",")
['circle', '4.5']

>>> str.split(",")[0]
'circle'
>>> str.split(",")[1]
'4.5'

根据您的正则表达式: -

ma = re.search(r"(\w+)[,(\d+.\d+)]+", "Triangle,3.4,1.2")

您正在使用字符集[,(\d+.\d+)],它匹配 -,(\d+.\d+)..

您应该将其更改为: -

ma = re.search(r"(\w+)(,(\d+.\d+))+", "Triangle,3.4,1.2")

但是在这种情况下存在一个问题:-

您只创建了 3 个组:-

group 0 -> complete match
group 1 -> `,1.2` (Outer bracket)
group 2 -> `1.2`  (Inner Bracket)

你不会得到3.4因为(,(\d+.\d+))第一次匹配 -,3.4然后,1.2..所以,它只记得,1.2..

于 2012-10-06T13:40:02.517 回答
1

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

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

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

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

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

有关遇到此限制的其他 SO 问题,请参阅有关解析方法签名的正则表达式问题带有捕获问题的 python 正则表达式重复。

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

>>> "Triangle,3.4,1.2".split(',')
['Triangle', '3.4', '1.2']
于 2012-10-06T14:34:15.400 回答