2014-03-12 39 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