2014-01-05 45 views
0

我想過濾使用Python 3.3以下格式的SQL文件(來源:維基百科):簡單的regex理解問題

INSERT INTO pagelinks VALUES(10,0, 'Computer_accessibility'),(12, 0, ' - 主義'),(12,0, '1848_Revolution'),(12,0, '1917_October_Revolution'),(12,0, '1919_United_States_anarchist_bombings')

INSERT INTO pagelinks VALUES(12, 0,'Albert_Camus'),(12,0,'Albert_Libertad'),(12,0,'Albert_Meltzer'),(12,0,'Aleister_Crowley'),(12,0,'Alex_Comfort')

因此,基本上你有以INSERT語句開頭的行,然後是括號中的內容元組,它們之間用逗號分隔。每行以最後一個項目的右括號結束。正則表達式一次只能處理單行。

我要提取的第一個整數(在本例或)和UTF-8字符串,但只的條件下,第二個整數爲0(零)。我使用group()功能爲此與以下正則表達式...

\((\d+),0,'(\S+)' 

...嘗試各種其他組合稍作修改。我能夠按預期得到所有整數的集合,但是一旦我嘗試匹配字符串部分,整個剩餘行就成爲第二組的匹配。

所以不是

10 Computer_accessibility 
12 -ism 

我得到

10 Computer_accessibility'),(12,0,'-ism'),(etc.. 

如何判斷髮動機停止在閉幕式'')對每個組項目?

回答

2

+量詞是貪婪的,這意味着它會消耗盡可能多的字符。爲了使其不貪婪,請在其上附加一個問號:\((\d+),0,'(\S+?)'

+0

那麼,你已經修好了。我想到\ S可能會匹配最後一個單引號本身,或者它是否被視爲空格?如果不是,那麼這個非貪婪的方式是否意味着它注意到了結尾「並且採取了第一場比賽,即到那時爲止的內容? – Adrian

+2

@Adrian'\ s'匹配所有空格字符(空格,製表符,換行符等); '\ S'匹配所有不是空白字符的東西,所以是的,它匹配一個單引號。非貪心量詞會消耗一個字符,然後嘗試匹配單引號;它會繼續消耗更多的角色,直到最終匹配單引號。如果不能,整個比賽將失敗。 –