2015-12-29 96 views
-3

我有這樣的正則表達式/ Python代碼:Python的正則表達式:sre_constants.error:不平衡括號

REGISTRY_REGEX = re.compile("((HKEY(?:_\w+)+|HK[CLU][RUMC])\\([a-zA-Z\d\/\\.{}\s-]+))") 

這應該符合這個字符串:

HKLM\SYSTEM\CurrentControlSet\Services\aRandomServiceName 

當我運行我的python腳本,它返回:

Traceback (most recent call last): 
    File "regex_id.py", line 11, in <module> 
    REGISTRY_REGEX = re.compile("((HKEY(?:_\w+)+|HK[CLU][RUMC])\\([a-zA-Z\d\/\\.{}\s-]+)))") 
    File "/usr/lib/python2.7/re.py", line 194, in compile 
    return _compile(pattern, flags) 
    File "/usr/lib/python2.7/re.py", line 251, in _compile 
    raise error, v # invalid expression 
sre_constants.error: unbalanced parenthesis 

這個正則表達式似乎在RegExr中工作,我錯過了什麼?

+3

中的問題,並在堆棧跟蹤正則表達式是不同的。堆棧跟蹤中的最後有''''。 – ndn

+1

UNESCAPE的(.. –

+0

我試過你的模式前添加'r'這樣說:'re.compile(R「((HKEY(?:_ \ w +)+ |香港[CLU] [RUMC])\\ ([A-ZA-Z \ d \/\\ {} \ S - ] +)))「)'有錯誤信息不見了 –

回答

3

首先,您的問題中的表達式和回溯中的表達式是不同的。前者有兩個右括號,後者有三個。

第二個問題是,兩個都有太多的右括號。由於使用的是雙引號,所有的反斜線越來越之前取代通過重新被編譯。

的解決方案是使用原始字符串,以便您的反斜槓沒有得到取代兩次:

REGISTRY_REGEX = re.compile(r"((HKEY(?:_\w+)+|HK[CLU][RUMC])\\([a-zA-Z\d\/\\.{}\s-]+))")