2010-03-05 3 views
5

이 조건을 만족시키는 단일 정규식을 얻을 수있는 방법이 있습니까 ?? 나는 세트 MBIPI, 순서, 에서 세 글자가있는 "단어"를 찾고 있어요 그러나 I.어떻게 부울 AND를 정규식에 포함합니까?

예를 포함해야한다

.

re.match ("[MBDPI {3}"foo에) 및 "I"에 foo

그래서 올바른 결과 (re 모듈을 사용 파이썬)이지만, I로부터이 얻을 수있다 하나의 정규식?

>>> for foo in ("MBI", "MIB", "BIM", "BMI", "IBM", "IMB", "MBD"): 
...  print foo, 
...  print re.match("[MBDPI]{3}", foo) and "I" in foo 
MBI True 
MIB True 
BIM True 
BMI True 
IBM True 
IMB True 
MBD False 

정규식이있는 경우 사용할 수 있음을 알고 있습니다. 부울 OR 연산자로 있지만 부울 AND 이에 상응하는 연산자가 있습니까?

또는 전방 또는 후방 조회가 필요합니까?

\b(I[MBDPI]{2}|[MBDPI]I[MBDPI]|[MBDPI]{2}I)\b 

\b 문자가 0 폭 단어 경계를 일치 :

+0

str.find()를 사용하여 'I'문자를 검색 할 수도 있습니다. 출처 : http://docs.python.org/library/stdtypes.html#str. – Dor

답변

2

또는 당신이 할 수있는 유일한 방법에 관한 것입니다. 이렇게하면 정확히 3 자 길이의 항목과 일치하게됩니다.

다른 방법으로는 regular language이 할 수있는 범위를 실행하고 있습니다. 그룹

\b[MBDPI]{3}\b 

캡처 한 다음 I.

편집을 찾습니다 :

대안이 일치하는 것입니다, 내가 Jens' answer 적응 것이다 완전한 답을 갖는 위해서Testing The Same Part of a String for More Than One Requirement :

\b(?=[MBDPI]{3}\b)\w*I\w* 

단어 경계 검사를 사용하여 길이가 3 자임을 확인하십시오.

이것은 좀 더 고급 솔루션이며 더 많은 상황에 적용 할 수 있지만 일반적으로 읽기 쉬운 것이 좋습니다 ("또는"버전 임).

3

부울을 가짜로 만들거나 미리보기를 사용하여 만들 수 있습니다. http://www.regular-expressions.info/lookaround2.html에 따르면,이 사건에 대한 작동합니다

"\b(?=[MBDPI]{3}\b)\w*I\w*" 
+0

아마 단어 경계 검사가 필요하지만 그렇지 않으면 +1, 영리한 해결책이 필요합니다. – cletus

+0

그걸 편집하겠습니다 ... – Jens

+0

위대한 링크, 고마워요. – user213043

2
당신은 I가 존재하는지 내다을 사용할 수

: 내가 사용할 수 있습니다 알고 정규식

(?=[MBDPI]{0,2}I)[MBDPI]{3} 
0

| 부울 OR 연산자로 있지만 부울 AND 이에 상응하는 연산자가 있습니까?

A 및 B =하지 (하지 여부 B) = ([^ A] |?! [^ B]) 실제로는 공통 부재를 가질 수있다

A 및 B 인 표현.

관련 문제