sre_constants.error:missing),未终止的子模式

时间:2018-05-24 10:04:42

标签: python regex python-3.x

我是gaurav,我正在学习编程。我正在阅读潜入python 3中的正则表达式,所以我想尝试自己的东西,所以我在eclipse中编写了这段代码但是我有很多错误。任何人都应该帮助我

import re
def add_shtner(add):
    return re.sub(r"\bROAD\b","RD",add)
print(add_shtner("100,BROAD ROAD"))


# a code to check valid roman no.
ptn=r"^(M{0,3})(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3}$)"
def romancheck(num):
    num=num.upper()
    if re.search(ptn,num):
        return "VALID"
    else:
        return "INVALID"
print(romancheck("MMMLXXVIII"))
print(romancheck("MMMLxvviii"))

mul_line_str='''adding third argument
             re.VERBOSE in re.search()     
                   will ignore whitespace
                               and comments'''

print(re.search("re.search()will",mul_line_str,re.VERBOSE))
print(re.search("re.search() will",mul_line_str,re.VERBOSE))
print(re.search("ignore",mul_line_str,re.VERBOSE))

ptn='''
     ^                        #beginning of the string
     M{0,3}                   #thousands-0 to 3 M's
     (CM|CD|D?C{0,3}          #hundreds
     (XC|XL|L?XXX)            #tens
     (IX|IV|V?III)            #ones 
     $                        #end of the string
     '''
print(re.search(ptn,"MMMCDLXXIX",re.VERBOSE))
def romanCheck(num):
    num=num.upper()
    if re.search(ptn,num,re.VERBOSE):
        return "VALID"
    else:
        return "INVALID"

print(romanCheck("mmCLXXXIV"))
print(romanCheck("MMMCCLXXXiv"))

我写了这段代码然后我跑了但是我得到了这个 -

100,BROAD RD
VALID
INVALID
None
None
<_sre.SRE_Match object; span=(120, 126), match='ignore'>
Traceback (most recent call last):
  File "G:\pydev\xyz\rts\regular_expressions.py", line 46, in <module>
    print(re.search(ptn,"MMMCDLXXIX",re.VERBOSE))
  File "C:\Users\Owner\AppData\Local\Programs\Python\Python36\lib\re.py", line 182, in search
    return _compile(pattern, flags).search(string)
  File "C:\Users\Owner\AppData\Local\Programs\Python\Python36\lib\re.py", line 301, in _compile
    p = sre_compile.compile(pattern, flags)
  File "C:\Users\Owner\AppData\Local\Programs\Python\Python36\lib\sre_compile.py", line 562, in compile
    p = sre_parse.parse(p, flags)
  File "C:\Users\Owner\AppData\Local\Programs\Python\Python36\lib\sre_parse.py", line 856, in parse
    p = _parse_sub(source, pattern, flags & SRE_FLAG_VERBOSE, 0)
  File "C:\Users\Owner\AppData\Local\Programs\Python\Python36\lib\sre_parse.py", line 416, in _parse_sub
    not nested and not items))
  File "C:\Users\Owner\AppData\Local\Programs\Python\Python36\lib\sre_parse.py", line 768, in _parse
    source.tell() - start)
sre_constants.error: missing ), unterminated subpattern at position 113 (line 4, column 6)

这些错误是什么,任何人都可以帮助我。 我已经理解了所有的输出,但我无法理解这个错误

1 个答案:

答案 0 :(得分:0)

错误表示您已将格式错误的正则表达式传递给第46行的search()函数。

虽然您已在此行中定义了有效的RegEx:

ptn=r"^(M{0,3})(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3}$)"

你稍后用似乎是一些帮助/ docstring覆盖这个模式(ptn):

ptn='''
     ^                        #beginning of the string
     M{0,3}                   #thousands-0 to 3 M's
     (CM|CD|D?C{0,3}          #hundreds
     (XC|XL|L?XXX)            #tens
     (IX|IV|V?III)            #ones 
     $                        #end of the string
     '''

这不是有效的RegEx模式,它在(CM|CD|D?C{0,3}之后缺少结束括号。 您在nex行print(re.search(ptn,"MMMCDLXXIX",re.VERBOSE))中将此新字符串作为正则表达式传递,并且re.compile()会抛出该错误。

如果您使用变量的其他名称来保存第27行中的help / docstring(基于您的示例代码或基于您的堆栈跟踪的第38行),一切看起来都很好:

100,BROAD RD
VALID
INVALID
None
None
<_sre.SRE_Match object; span=(85, 91), match='ignore'>
<_sre.SRE_Match object; span=(0, 10), match='MMMCDLXXIX'>
VALID
VALID