3

基本的なPython正規表現の問題としてしたいと思います。データセットがあります

line = "(1,2) (2,3)" 

それは何度も繰り返すことができるので、線も

line = "(1,2) (3,4) (6,5)"

正規表現があります

rx = "(\(\s*\d+\s*,\s*\d+\s*\)\s*){2,}$"

が欲しいです

a = re.match(rx,line).groups();

合わせる

('(1,2)','(3,4)'...)

しかし、私は最後の(6,5)しか一致させることができません。括弧で囲まれた入力の数がわからないため、最後の$が必要です。そうでない場合は、次のような誤った入力が必要です。

(1,2),(3,4),(5,6

正規表現を渡します。

任意のヒント?

編集:データが詳細に正確にフォーマットされていないという事実を追加しました。その代わり

line= 'blah(1,2) (2,3)blah'

したがって、正規表現が必要です

ありがとう

4

4 に答える 4

6

見よ、正規表現のない魔法:

>>> "(1,2) (3,4) (6,5)".split()
['(1,2)', '(3,4)', '(6,5)']
于 2012-09-20T23:22:27.900 に答える
4

本当に正規表現を使用したい場合(私は正規表現のスペシャリストではありませんが、指定されたデータで機能しました):

r = "[\(\d+,\d+\)]{1,}"
c = re.findall(r,line)

または、ナイトクラッカーの優れた提案に従ってください。ほとんどの場合、最も単純な答えがより良い答えです。

編集:提案をしてくれたJoranBeasleyに感謝します。

于 2012-09-20T23:26:09.037 に答える
1

使ってみてくださいre.findall(rx, line)

于 2012-09-20T23:22:55.603 に答える
0

Borgleaderの答えは次のことにつながることに注意してください。

>>> re.findall(r'[\(\d+,\d+\)]{1,}', '(1, 2),(2,3)')
['(1,', '2),(2,3)']

上記のケースに対するJoranBeasleyの答えは次のとおりです。

re.findall(r"(\([^)]*\))", '(1, 2),(2,3)')
['(1, 2)', '(2,3)']

しかし、包括的すぎます:

>>> re.findall(r"(\([^)]*\))", '(1, blah2),(2,3)')
['(1, blah2)', '(2,3)']

数字のみを含める場合は、次のようにします。

>>> re.findall(r'\(\s*\d+\s*,\s*\d+\s*\)', '(1, 2),(2,3)')
['(1, 2)', '(2,3)']
>>> re.findall(r'\(\s*\d+\s*,\s*\d+\s*\)', '(1, blah2),(2,3)')
['(2,3)']
>>> re.findall(r'\(\s*\d+\s*,\s*\d+\s*\)', '(1, 2),(2,3) (6, 5')
['(1, 2)', '(2,3)']

最終結果のスペースを削除する場合:

>>> [x.replace(' ', '') for x in re.findall(r'\(\s*\d+\s*,\s*\d+\s*\)', '(1, 2),(2,3) (6, 5')]
['(1,2)', '(2,3)']

または、タブなどがある場合:

>>> sp = re.compile('\s')
>>> [sp.sub('', x) for x in re.findall(r'\(\s*\d+\s*,\s*\d+\s*\)', '(1, 2),( 2, 3 ) (6, 5')]
['(1,2)', '(2,3)']

もちろん、データセットは最も単純な方が適しています。

于 2012-09-21T07:20:16.003 に答える