2014-10-11 4 views
2

긴 정규 표현식을 작은 덩어리로 분해하려고합니다. A에서 B로 변경하는 것이 가능한가/좋은 습관입니까?일반 표현식에서 줄 바꿈

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) 

편집 : 파이썬 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 

오류 : 당신은 triple-quoted (multi-line) string를 사용하고 여러 줄에 걸쳐 정규식 패턴을 깰 수있는 re.VERBOSE 플래그를 설정할 수 있습니다

(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

:

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을 사용하거나 Regex 패턴의 시작 부분에 (?x)을 두어 자세한 플래그를 활성화 할 수 있습니다.

+0

트리플은 무엇입니까? –

+0

다중 행 문자열 – TidB

+0

@asfadsfaf - 문자열 리터럴이 여러 줄에 걸쳐 있어야합니다. 잠시만 기다려주세요. 문서 링크가 포함됩니다. – iCodez

0

당신은 또한 다음과 같이 큰 따옴표를 사용하여 여러 회선을 통해 귀하의 표현을 분리 할 수 ​​있습니다 :

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