2010-06-28 2 views
4

이것은 파이썬에서 조건부 정규 표현식을 포함하는 질문 :파이썬 조건부 정규 표현식

내가

와 문자열 " a"

match(1)="a" 
match(2)="b" 
match(3)="c" 

로 문자열을 "abc" 일치뿐만 아니라 일치하고 싶습니다

match(1)="a" 
match(2)="" 
match(3)="" 

다음 코드는 ALMOST가 수행하는 코드입니다. 첫 번째 경우는 match(1)="a" bu입니다. 두 번째 경우에는 match(4)="a" (원하는 경우 match(1)이 아님).

실제로 모든 그룹을 반복하여 for g in re.search(myre,teststring2).groups():으로 처리하면 예상 한대로 3 개가 아니라 6 개의 그룹이 생성됩니다.

import re 
import sys 

teststring1 = "abc" 
teststring2 = " a" 

myre = '^(?=(\w)(\w)(\w))|(?=\s{2}(\w)()())' 

if re.search(myre,teststring1): 
    print re.search(myre,teststring1).group(1) 

if re.search(myre,teststring2): 
    print re.search(myre,teststring2).group(1) 

의견이 있으십니까? (파이썬 2.5에 대한 것임)

답변

5

... :

import re 
import sys 

teststring1 = "abc" 
teststring2 = " a" 

myre = '^\s{0,2}(\w)(\w?)(\w?)$' 

if re.search(myre,teststring1): 
    print re.search(myre,teststring1).group(1) 

if re.search(myre,teststring2): 
    print re.search(myre,teststring2).group(1) 

당신이 원하는대로이 두 경우 모두 a을 줄 않지만, 어쩌면 당신이 공백없이 예 (표시되지있어 다른 경우에 원하는 방식과 일치하지 않을 앞에 또는 공백 이후에 하나 이상의 문자가 일치하므로 일치하는 문자열의 전체 길이는 != 3 ...하지만 나는 단지 당신을 추측하고 있습니다 이 같은 경우에 일치하는 항목을 찾으시겠습니까 ...?)

+0

을 당신이 옳은 것 - 이것들은 다음 두 가지 경우에만 있습니다. 내가 바라는대로 작동합니다. 열쇠는 "?" 일치하는 그룹 (\ w?) 안에 있으므로 문자와 일치하거나 아무 것도 일치하지 않습니다. 감사! – Mike

+0

@Mike, 언제든지 환영합니다. 언제나 도와 드리겠습니다! –

1
myre = '^(?=\s{0,2}(\w)(?:(\w)(\w))?)' 

당신이 원하는 방식으로 설명하는 두 가지 경우를 처리 할 것이지만 반드시 일반적인 해결책은 아닙니다. 진짜 장난감을 대표하는 장난감 문제를 생각해 냈습니다.

나중 요소의 처리가 이전 것 및/또는 그 역의 처리에 의존하기 때문에 일반적인 해결책을 찾기가 매우 어렵습니다. 예를 들어 abc이 있으면 초기 공백이 없어야합니다. 초기 공백이 있으면 a 만 찾아야합니다.

내 의견으로는, 이것을 처리하는 가장 좋은 방법은 원래 가지고 있던 | 구조입니다. 그룹을 배열로 끌어 와서 원하는대로 정렬하는 코드가 있습니다.

그룹의 규칙은 모두 열기 괄호이며 바로 뒤에 ?:이 그룹이됩니다. 그 그룹은 실제로 아무것도 일치하지 않았으므로 비어있을 수 있지만 거기에있게됩니다.

어쩌면
3

표현식의 각 캡처 그룹은 그것은 자신의 색인입니다. 이 시도 :

r = re.compile("^\s*(\w)(\w)?(\w)?$") 

abc -> ('a', 'b', 'c') 
a -> ('a', None, None) 

그것을 무너 뜨리는 :

^  // anchored at the beginning 
\s* // Any number of spaces to start with 
(\w) // capture the first letter, which is required 
(\w)? // capture the second letter, which is optional 
(\w)? // capture the third letter, which is optional 
$  // anchored at the end