2014-10-11 2 views
2

Я пытаюсь разбить длинное регулярное выражение на более мелкие куски. Возможно ли/передовая практика изменить А на Б?Разделение строк в регулярном выражении

A:

line = re.sub(r'\$\{([0-9]+)\}|\$([0-9]+)|\$\{(\w+?\=\w?+)\}|[^\\]\$(\w[^-]+)|[^\\]\$\{(\w[^-]+)\}',replace,line) 

B:

line = re.sub(r'\$\{([0-9]+)\}|' 
       r'\$([0-9]+)|' 
       r'\$\{(\w+?\=\w?+)\}|' 
       r'[^\\]\$(\w[^-]+)|' 
       r'[^\\]\$\{(\w[^-]+)\}',replace,line) 

Edit:

Я получаю следующее сообщение об ошибке при запуске этого в Python 2:

def main(): 
while(1): 
    line = raw_input("(%s)$ " % ncmd) 
    line = re.sub(r''' 
        \$\{([0-9]+)\}| 
        \$([0-9]+)| 
        \$\{(\w+?\=\w?+)\}| 
        [^\\]\$(\w[^-]+)| 
        [^\\]\$\{(\w[^-]+)\} 
        ''',replace,line,re.VERBOSE) 
    print '>> ' + line 

Ошибка:

(1)$ abc 
Traceback (most recent call last): 
    File "Test.py", line 4, in <module> 
    main() 
    File "Test.py", line 2, in main 
    [^\\]\$\{(\w[^-]+)\}''',replace,line,re.VERBOSE) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py", line 151, in sub 
    return _compile(pattern, flags).sub(repl, string, count) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py", line 242, in _compile 
    raise error, v # invalid expression 
sre_constants.error: multiple repeat 
+0

Насколько я знаю, это часто используется, иногда с дополнительными комментариями по каждой строке, объясняющой регулярки части. – TidB

+0

Вам будет лучше использовать режим «расширенный». Также у вашего регулярного выражения проблемы. Например, '\ $ (\ w [^ -] +)' и '\ $ \ {(\ w [^ -] +) \}' открыты. – sln

ответ

1

Вы можете использовать triple-quoted (multi-line) string и установить re.VERBOSE флаг, который позволяет разбить Regex шаблон на несколько строк:

line = re.sub(r''' 
\$\{([0-9]+)\}| 
\$([0-9]+)| 
\$\{(\w+?\=\w?+)\}| 
[^\\]\$(\w[^-]+)| 
[^\\]\$\{(\w[^-]+)\} 
''', replace, line, re.VERBOSE) 

Вы можете даже включать комментарии непосредственно внутри строки:

line = re.sub(r''' 
\$\{([0-9]+)\}|    # Pattern 1 
\$([0-9]+)|     # Pattern 2 
\$\{(\w+?\=\w?+)\}|   # Pattern 3 
[^\\]\$(\w[^-]+)|   # Pattern 4 
[^\\]\$\{(\w[^-]+)\}  # Pattern 5 
''', replace, line, re.VERBOSE) 

И, наконец, следует отметить, что вы также можете активировать подробный флаг, используя re.X или разместив (?x) в начале вашего шаблона Regex.

+0

Что такое тройной '' '? –

+0

Многострочные строки – TidB

+0

@asfadsfaf - вам нужно, чтобы строка с буквами охватывала несколько строк. Дайте мне секунду, и я включу ссылку docs. – iCodez

0

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

line = re.sub(r"\$\{([0-9]+)\}|\$([0-9]+)|" 
       r"\$\{(.+-.+)\}|" 
       r"\$\{(\w+?\=\w+?)\}|" 
       r"\$(\w[^-]+)|\$\{(\w[^-]+)\}",replace,line)