2014-03-12 36 views
2

爲了檢查是否一個字符串是一個有效的正則表達式我用下面的代碼:有效的正則表達式

import re 

try: 
    re.compile('(0*|2*)') 
    is_valid = True 
    print(is_valid) 
except re.error: 
    is_valid = False 
    print(is_valid) 

我的問題是如何看re.compile('(0*|2*)')檢查,如果在字符串中傳遞有效的正則表達式。換句話說,它在後臺對字符串做了些什麼來檢查它是否有效。我認爲這是這樣做也許串轉向到一個列表,例如在字符串「(0 * | 2 *)」作爲一個名單將是:

['(', '0', '*', '|', '2', '*', ')'] 

,然後檢查是否第一和最後的項目在組合時是有效的,如果它移動到第二個項目和第二個最後項目並重復該過程,但是情況並非如此,因爲它會在* 2時返回false。

如果任何人都可以解釋算法/它是如何檢查以查看傳入的字符串是否是一個有效的僞代碼正則表達式,至少會真正讚賞。

+0

看看'sre_compile.py'在你的Python安裝。 – metatoaster

回答

1

re.compile命令分析字符串。你可以看到它與re.DEBUG標誌做:

re.compile('(0*|2*)',re.DEBUG) 
subpattern 1 
    branch 
    max_repeat 0 65535 
     literal 48 
    or 
    max_repeat 0 65535 
     literal 50 
<_sre.SRE_Pattern object at 0x101b6b780> 

當你的表達有錯誤,你會看到什麼,以及如何:

re.compile('(0*|2*\)',re.DEBUG) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py", line 190, in compile 
    return _compile(pattern, flags) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py", line 244, in _compile 
    raise error, v # invalid expression 
sre_constants.error: unbalanced parenthesis