2015-09-08 8 views
4

Пример кода:Получить сообщение об ошибке при попытке использовать ` 1 ', которые получают из регулярных выражений` ( d) `в Python

#!/usr/bin/env python 
import re 

print re.sub(r'a+(\d)?', r'\1', "aaaa3") 
print re.sub(r'a+(\d)?', r'\1', "aaaa") # error! 

Второе print заявление дает мне ошибку:

3 
Traceback (most recent call last): 
    File "./bbb.py", line 5, in <module> 
    print re.sub(r'a+(\d)?', r'\1', "aaaa") 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py", line 155, in sub 
    return _compile(pattern, flags).sub(repl, string, count) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py", line 291, in filter 
    return sre_parse.expand_template(template, match) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/sre_parse.py", line 831, in expand_template 
    raise error, "unmatched group" 
sre_constants.error: unmatched group 

Как я могу справиться с этой переменной захвата с вероятным квантором 0 без ошибок?

Примечание(\d)? здесь может быть еще сложнее регулярное выражение, а не просто легко, как \d, вот почему я взять с собой квантор ? из вне (..).

+0

Переместите '?' Внутри группы захвата. –

+1

В Python вы не можете выполнить обратную ссылку (неудачные) группы захвата. Но вы можете в JavaScript :) –

+0

Я пробую этот простой код на https://regex101.com/#python, это работа, но на моем терминале это не работает, тогда я немного смущен. В любом случае, спасибо за ваши ответы. – fronthem

ответ

2

В Python вы можете сделать это, чтобы получить пустую обратную ссылку необязательной группы:

>>> print re.sub(r'a+(\d?)', r'\1', "aaaa") 

>>> print re.sub(r'a+(\d?)', r'\1', "aaaa123") 
123 

т.е. использовать (\d?) вместо (\d)?

регулярных выражения Python в отличии от многих других регулярных выражений двигателей не заполнять обратные ссылки, когда соответствующая группа захвата не соответствует шаблону.