2016-10-12 61 views
-2

我想從文件中讀取,每一行包含一個正則表達式的正則表達式:從文件中讀取的正則表達式,避免或撤消逃避

lorem.* 
dolor\S* 

下面的代碼應該閱讀每追加到列表正則表達式的字符串:

vocabulary=[] 
with open(path, "r") as vocabularyFile: 
    for term in vocabularyFile: 
     term = term.rstrip() 
     vocabulary.append(term) 

此代碼似乎逃脫文件\\\特殊字符。我怎麼能避免逃避或忽略字符串,以便它可以像我寫這個一樣工作?

regex = r"dolor\S*" 
+1

這只是一個可視化的東西,字符串不會被轉義。通過在REPL中鍵入'r「dolor \ S *」'進行驗證(然後顯示''dolor \\ S *'')。 – L3viathan

+0

*此代碼以\\格式轉義文件中的\特殊字符。*否。如果*回顯*值,那麼Python解釋器會將該值表示爲'dolor \\ S *''以使其可重現,但這不是同一回事。 –

+0

顯示正則表達式時,您會看到'\\',但它只是'\'字符的表示形式。不需要任何東西恕我直言。 – Tryph

回答

1

你正在通過呼應值混淆。 Python解釋通過打印repr()函數結果相呼應的值,並且這使得確保逃脫的任何元字符:

>>> regex = r"dolor\S*" 
>>> regex 
'dolor\\S*' 

regex仍然是一個8字符串,不是9,並且在索引5的單個字符是一個單一反斜線:

>>> regex[4] 
'r' 
>>> regex[5] 
'\\' 
>>> regex[6] 
'S' 

打印字符串寫入了所有字符一字不差,所以沒有逃脫髮生:

>>> print(regex) 
dolor\S* 

個同樣的過程被施加到容器的內容物,如listdict

>>> container = [regex, 'foo\nbar'] 
>>> print(container) 
['dolor\\S*', 'foo\nbar'] 

注意,我沒有回聲存在,我打印。 str(list_object)在此產生與repr(list_object)相同的輸出。

如果您是從列表中打印單個元素,您收到相同的轉義結果:

>>> print(container[0]) 
dolor\S* 
>>> print(container[1]) 
foo 
bar 

注意如何在第二個元素\n被作爲一個新行現在寫出來。 的原因是容器使用repr()作爲內容;使其他難以檢測或不可打印的數據可見。

換句話說,你的字符串做不是這裏包含轉義字符串。