2013-01-09 79 views
0

在一個文件,我可以有以下兩種字符串格式:匹配兩段幾乎相同的字符串(蟒蛇)

::WORD1::WORD2= ANYTHING 
::WORD3::WORD4::WORD5= ANYTHING2 

這是我想出了正則表達式:

::(\w+)(?:::(\w+))?::(\w+)=(.*) 

regex.findall(..) 

[(u'WORD1', u'', u'WORD2', u' ANYTHING'), 
(u'WORD3', u'WORD4', u'WORD5', u' ANYTHING2')] 

我的第一個問題是,爲什麼我在匹配第一個字符串時得到這個空的u''

我的第二個問題是,有沒有更簡單的方法來寫這個正則表達式?這兩個字符串非常相似,只是有時我有這個額外::WORD5

我的最後一個問題是:大部分時間我有::之間只有一個字所以這就是爲什麼\w+是足夠了,但有時我能得到的東西一樣2-WORD23-2-WORD2等..有這個-出現。我如何將它添加到\w+

+0

相同somethign剛編輯.... – Johny19

回答

0

基於對thg435你可以拆分爲「=」,然後回答做的一樣

left,right = a.split('=', 1) 
answer = left.split('::')[1:] + [right] 
+0

我認爲你應該使用thg的答案,他更新了他的第一個。 – Alexis

0

對於你的最後一個問題,你可以這樣做(接受字母,數字和「 - 」)

[a-zA-Z0-9\-]+ 
+0

或做利雅說什麼,這是甚至更好:p – Alexis

1

捕獲組總是包含在re.findall結果,即使它們不匹配任何東西。這就是爲什麼你得到一個空字符串。如果你只是想獲得的分隔符之間有什麼,嘗試split而不是findall

a = '::WORD1::WORD2= ANYTHING' 
b = '::WORD3::WORD4::WORD5= ANYTHING2' 

print re.split(r'::|= ', a)[1:] # ['WORD1', 'WORD2', 'ANYTHING'] 
print re.split(r'::|= ', b)[1:] # ['WORD3', 'WORD4', 'WORD5', 'ANYTHING2'] 

在迴應的意見,如果「任何」可能是好,什麼,它更容易使用字符串函數,而不是正則表達式:

x, y = a.split('= ', 1) 
results = x.split('::')[1:] + [y] 
+0

該解決方案看起來很簡單,但可能有點太簡單,因爲WORDx和ANYTHING之間的區別是不可能的,並且ANYING可能包含任何字符而不會進一步分割。 – guidot

+0

我認爲這對於Johny19的需求是行不通的。當他說「ANYTHING」時,它可能會在「ANYTHING」中得到「::」或「=」,這樣就會分解成一個列表。否則這將是一個優雅的解決方案 – Alexis

+0

是的亞歷克西斯和guidot)。但是,無論如何,謝謝thg435,這已經很不錯了! – Johny19

1

的最後一個問題:

[\w\-]+ 

解釋:

\w 匹配所有文字字符。