2

私はこの文字列を持っています

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

図形の名前とその横にある2つの数字をキャプチャしたいとします。私はこれを試しました、そして私がその中に持っている問題についてコメントします:

>>> 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

角かっこには特別な意味があります。それらは作成することを目的としていますCharacter class..したがって、capture groups角かっこ内に入れると、 group1、group2、またはgroup3に一致します..連続してすべてのグループに一致するわけではありません..capture group正方形の代わりに別のグループを使用する必要がありますブラケット..

ただし、この場合は単純に分割を使用できます。-

>>> 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

使用.split(',')するのが最も簡単な方法ですが、正規表現を使用する場合は、

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

角かっこは特別です。それらは、それらの中のすべての文字を文字グループとしてマークします。\d数字( )、,コンマ、ピリオド、.開き(括弧、または)閉じ括弧のいずれかに一致するように求めています。つまり、開き括弧と閉じ括弧は一致した文字の一部であり、キャプチャグループを示すものではありません。

ここでは文字クラスを使用する必要はありません。ピリオドの後に別の数字が続く、より具体的な数字のパターンを探しています。非キャプチャグループ((?:...))を使用して、数値の形式をコンマと一緒にグループ化し、数値の繰り返しグループと一致させます。

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

残念ながら、これでも複数のグループをキャプチャすることはできません。正規表現が可変数のグループを生成することはありません。ここでは2つのグループのみを定義したので、次のようになります。

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

この制限に遭遇した他のSOの質問については、メソッドのシグネチャの解析とPythonの正規表現の繰り返しとキャプチャの質問に関するRegexの質問を参照してください。

あなたのフォーマットは実際には非常に単純であり、正規表現をまったく使用しない方がはるかに良いでしょう。カンマで分割して、,それで完了します。

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