2011-03-14 107 views
-1

我有一個文件,其中包含要在db中查找正則表達式的列表。正則表達式和轉義序列

一個這樣的模式是(/|\)cmd\.com$。但是,當我使用它與重新模塊,它拋出了以下錯誤。如果我使用重新模式(/|\\\\)cmd\.com$,它的工作原理。

所以,問題是當我從一個文件中讀入EX的變量時:a,如何將它轉換爲具有四個反斜槓的reg模式,以便它開始使用python re模塊。

另外,當reg模式被分配給變量EX時,我們如何轉義這種轉義序列:下面的「a」。

對此的任何幫助表示讚賞。

import re 
a='(/|\)cmd\.com$' 
re.compile(a) 

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.6/re.py", line 190, in compile 
    return _compile(pattern, flags) 
    File "/usr/lib/python2.6/re.py", line 245, in _compile 
    raise error, v # invalid expression 
sre_constants.error: unbalanced parenthesis 

THX, Santhosh

+0

你想匹配什麼? – 2011-03-14 04:29:13

回答

1

在你上面的例子,你需要做的正則表達式一個Python 「原始」 的字符串,像這樣:

re.compile(r'put the pattern here') 

如果您發佈您的代碼我可能能夠幫助你解決從文件加載模式的問題。

+0

我意識到這一點,但可能是我需要直接提出問題。 讓我們說我有一個正則表達式的文件。所以, 進口重新 的項目中打開(文件, 'R')readlines方法(): re.compile(R項目) 我如何將[R項目結合在一起的re.compile上述聲明。希望它是明確的。 – Santhosh 2011-03-16 05:11:56

+0

不,re.compile()意味着在* pattern *上調用。所以: ' 進口重新 模式= re.compile(這裏r'your模式「) 在開放(文件)項目.readlines(): 匹配= pattern.match(項目) 如果匹配: 通#做點什麼 ' – 2011-03-29 04:09:49

3

首先請注意,您的原始正則表達式無效。它應該是(/|\\)cmd\.com$。如果這樣的字符串來自數據庫(或代碼中的字符串字面以外的任何其他源),那麼在正則表達式引擎看到它之前不需要執行額外的操作 - 斜槓是正確的。

全部細節,並解釋:

反斜槓的特別之處在於他們逃脫其他字符,給他們不同的含義。

a = '(/|\)cmd\.com$' 

在該正則表達式,所述)是特殊的,指示分組表達式的結尾;反斜槓將它轉義爲使其解釋爲文字),而不是您想要的(以及爲什麼會得到有關不匹配括號的錯誤)。

您需要轉義反斜槓才能將其解釋爲文字\;這可以使用另一個反斜線來完成:

a = '(/|\\)cmd\.com$' 

然而,即使這是不行的,因爲在Python有處理的兩個級別回事(因此兩個級別的轉義需要):首先,字符串字面評估反斜槓並且專門解釋反斜線(字符串方式,其中例如\.無意義,因此評估爲\.--然而\\評估爲\)。然後,當正則表達式引擎獲得該字符串時,它會解釋中的任何文字反斜槓專門對象(正則表達式,例如\.使.文字而不是「任何字符」)。所以,你最終用:

a = '(/|\\\\)cmd\\.com$' # Escaped version of (/|\\)cmd\.com$ which is what regex engine will see 

因爲這個問題是如此普遍,Python有文字串的方式使得反斜槓在琴絃處理階段特殊處理:"raw" string literals

a = r'(/|\\)cmd\.com$' # backslashes here will be interpreted as literal \ characters 

正則表達式引擎仍然會特意解析字符串中的反斜槓(原始字符串只是寫入文字的一種方式;它仍然會產生一個普通的對象)。

+0

我意識到這一點,但可能是我需要把問題直接。 讓我們說我有一個正則表達式的文件。所以, 進口重新 的項目中打開(文件, 'R')readlines方法(): re.compile(R項目) 我如何將[R項目結合在一起的re.compile上述聲明。希望它是明確的。 – Santhosh 2011-03-16 05:16:17

+0

@Santhosh:不太清楚你在問什麼。你想把正則表達式列表放入一個大的列表中嗎?如果是這樣,'string = open(file,'r')。read()。replace('\ n','')'應該做的。然後,你可以說're.compile(string)' – Cameron 2011-03-16 05:29:09