2012-09-20 31 views
3

我想作爲一個基本的Python正則表達式問題。 我有一個數據集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' 

因此,我們確實正則表達式需要

感謝

+1

有些人在遇到問題時,認爲 「我知道,我會用正則表達式。」現在他們有兩個問題。 –

回答

4

如果您回覆盟友要使用正則表達式(我不是一個正則表達式的專家,但它與給定數據的工作):

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

或是按照nightcracker的很好的建議。通常最簡單的答案是更好的答案。

編輯:感謝喬蘭·比斯利的建議。

+0

你需要'\ d +' –

+0

哦,好的,讓我解決這個問題! :) – Borgleader

6

看哪,的沒有正則表達式的魔力:

>>> "(1,2) (3,4) (6,5)".split() 
['(1,2)', '(3,4)', '(6,5)'] 
+0

正確答案... –

+0

也許這會在正常情況下工作,但我省略了之前輸入垃圾和垃圾的事實:so line =(blah(1,2)(2,3)blah) – user1573235

+0

我懷疑它實際上不是垃圾,它會更好地修剪出「垃圾」,然後使用一個簡單的拆分...至少這是我的猜測 –

1

嘗試使用re.findall(rx, line)

+0

'xx = re.findall(「(\([^)] * \))」 ,「(1,2)(2,3)」)'應該可以...但看到夜宵回答... –

+0

同意,夜宵的答案更「pythonic」 - 它更容易閱讀和修改。只有在你的文本解析非常複雜的情況下才使用RE,或者如果你這麼做的話,速度是一個問題 –

0

注意Borgleader的回答引出:

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

Joran比斯利的回答針對上述案例給出:

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)'] 

當然,最簡單的爲您的數據設定的更好。