拆分正则表达式中的行

时间:2014-10-11 19:37:29

标签: python regex

我试图将长长的正则表达式分解成更小的块。是否有可能/良好做法将A改为B?

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)

修改

在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

2 个答案:

答案 0 :(得分:1)

您可以使用triple-quoted (multi-line) string并设置re.VERBOSE标记,这样您就可以在多行中打破正则表达式模式:

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)放在正则表达式模式的开头来激活详细标记。

答案 1 :(得分:0)

您还可以使用双引号将表达式分隔为多行,如下所示:

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