2010-10-20 80 views
2

我試圖用python解析一個文件中的數據列表 - 但是我不想提取任何被註釋掉的數據。的數據結構的方式的一個例子是:Python正則表達式中的負面後顧

#commented out block 
uncommented block 
# commented block 

我想只檢索中的項目,所以我試圖用排除在開始哈希值的項目。問題是,一些哈希值是直接旁邊的註釋項目,以及一些的arent,我目前擁有的表達只有當項目已在第一個例子中這樣評價上述作品 -

(?<!#)(commented) 

我嘗試添加\ S +到負面的向前看,但然後我得到一個抱怨,表達式沒有明顯的最大長度。有沒有辦法做我想做的事情?

由於提前,

+0

也許你只需要像'^([^#] *)' – Andrew 2010-10-20 16:40:28

回答

6

爲什麼使用正則表達式? String方法會做就好了:

>>> s = """#commented out block 
uncommented block 
# commented block 
""".splitlines() 
>>> for line in s: 
    not line.lstrip().startswith('#') 


False 
True 
False 
+1

+1的正則表達式是偉大的......對於某些問題。對於其他人來說,有更好的解決方案(並且更加隱蔽); – delnan 2010-10-20 16:45:25

+1

+1:使用正確的工具進行工作。並不總是需要帶出大錘。 – JoshD 2010-10-20 16:52:22

+0

我結束了正則表達式搜索的組合,然後在開始時檢查#s的結果。我只想提取包含特定位的文件的某些部分,因此我使用正則表達式來搜索這些部分。 – Dan 2010-11-01 22:33:14

4

由於SilentGhost表示,正則表達式是不是解決這個問題的最佳解決方案,但我想我背後應對負面的樣子。

你以爲這樣做的:

(?<!#\s+)(commented) 

這是不行的,因爲看背後需要一個有限的長度。你可以做這樣的事情:

(?<!#)(\s+commented) 

這將匹配你想要的線條,當然,你必須剝除空白關閉註釋組。再次強調,字符串操作對於你所做的事情更好,但是我想表明,自從你問了以後,背後的負面看法是可行的。

0
>>> s = """#commented out block 
... uncommented block 
... # commented block 
... """ 
>>> for i in s.splitlines(): 
... if not i.lstrip().startswith("#"): 
...  print i 
... 
uncommented block