2012-05-17 2 views
2

모듈을 다시 사용하는 데 도움이 필요합니다. 나는 패턴이 있습니다파이썬 : 정규식 : 존재하는 경우, 그렇지 않으면 무시하십시오

나는 다음과 같은 텍스트에 정규식 실행하는 경우 발생하는 상황
pattern = re.compile('''first_condition\((.*)\) 
extra_condition\((.*)\) 
testing\((.*)\) 
other\((.*)\)''', re.UNICODE) 

:

text = '''first_condition(enabled) 
extra_condition(disabled) 
testing(example) 
other(something)''' 
result = pattern.findall(text) 
print(result) 
[('enabled', 'disabled', 'example', 'something')] 

그러나 하나 개 또는 두 개의 라인이 누락 된 경우, 정규식 반환 빈 목록을. 예 : 내 텍스트는 다음과 같습니다

[('enabled', '', '', 'something')] 

내가 몇 가지 명령에 그것을 할 수 있지만, 나는 그것이 하나의 정규식에서 그 일을보다 느리게 될 것이라고 생각 : 나는 싶어 무엇

text = '''first_condition(enabled) 
other(other)''' 

. 원본 코드는 sed를 사용하므로 매우 빠릅니다. 나는 sed를 사용하여 그것을 할 수 있지만, 나는 그것을 할 수있는 크로스 플랫폼 방법이 필요하다. 할 수 있습니까? Tanks!

P.

[('enabled', '', '', 'something')] 
+2

은 당신이 정말로 결과가 하나의 튜플을 포함하는 목록되고 싶어 :

import re keys = ['first_condition', 'extra_condition', 'testing', 'other'] d = dict(re.findall(r'^(.*)\((.*)\)$', text, re.M)) result = [d.get(key, '') for key in keys] 

가 온라인으로 작업을 참조하십시오? –

+0

@MarkByers : 아니오, 단일 목록이 더 좋습니다. – ghostmansd

+0

또는 단일 튜플이 필요하지 않습니다. – ghostmansd

답변

4

내가 먼저 사전에 구문 분석 : ideone

+2

'd = dict (re.findall (r '^ (.*) \ ((. *) \) $ ', text, re.M))'는 dict 생성을 위해 더 깨끗합니다. 또한 값에 공백이 있으면'text.split()'을'text.split ('\ n')'으로 변경해야합니다. –

+0

@StevenRumbalski : 조금 깨끗합니다. 고마워요. –

+0

이것은 매우 분명한 대답입니다. 감사! – ghostmansd

0

사용 옵션 물건에 대한 일치하지 않는 그룹 및 그룹을합니다

text = '''other(other) 
first_condition(enabled)''' 

절대적으로 같은 반환해야합니다 : 문자열의 순서가 무료입니다 경우도 좋을 것이다, 고정되어 있지 그룹 다음에 물음표를 넣으십시오 (선택 사항).

예 :

pat = re.compile(r'a\(([^)]+)\)(?:b\((?P<bgr>[^)]+)\)?') 

미안하지만 난 지금이 ​​권리를 테스트 할 수 없습니다. 위의 a(foo) 같은 문자열이 필요하고 선택적으로 b(foo) 같은 문자열과 일치 그리고 0

그룹으로 부모의 텍스트를 잡고이 일치하는 경우가 이름으로 명명 된 그룹으로 저장됩니다

: bgr

괄호 안의 내용과 일치 시키려면 .*을 사용하지 않았지만 [^)]+을 사용한다는 점에 유의하십시오. 닫는 괄호에 도달하면 일치가 중단되고 하나 이상의 문자가 필요합니다. 괄호가 비어 있으면 [^)]*을 사용할 수 있습니다.

이러한 패턴은 복잡해지고 있으므로 주석이 포함 된 자세한 패턴을 사용하는 것이 좋습니다.

임의의 순서로 나타날 수있는 여러 개의 선택적인 패턴을 가지려면 일치하지 않는 그룹에 모두 넣고 수직 막대로 구분하십시오. 순서를 알지 못하므로 명명 된 일치 그룹을 사용해야합니다. 임의의 수의 대체 패턴 (존재하지 않는 경우를 포함하여)을 허용하기 위해 일치하지 않는 그룹 다음에 별표를 추가하십시오.

관련 문제