2014-11-18 4 views
3

파이썬의 정규 표현식을 사용하여 문자열을 여러 단어와 일치 시키려고합니다. 예를 들어, 문자열은 "이들은 오렌지와 사과와 배이지만 파인애플이나 .."입니다. 찾으려는 단어 목록은 'and', 'or'and 'not'입니다. 상관없이 순서 또는 위치.파이썬 정규 표현식이 여러 단어와 일치합니다.

r'AND | OR | NOT 시도했지만 작동하지 않았습니다.

또한 그리고 힌트 .. 정규 표현식에서 r'.*?\bAND\b.*?\bOR\b.*?\bNOT\b.*?$ 여전히 작동하지 않았다 ...

안 좋은 시도? 감사합니다.

+0

당신이 그들을 캡처하거나 단지 그들이 있다는 것을 감지 하시겠습니까? – Cfreak

+0

존재 여부를 확인하기 만하면 'in'을 사용하십시오. 예를 들어, [0123]에 대한 단어는 [오렌지, 사과, 배,하지만 파인애플이나 ..]가 아닙니다. [True, True, True] ' – linuxfan

+0

@ Cfreak 그들을 캡처하십시오. – JudyJiang

답변

5

몇 가지 문제가 있습니다.

먼저 IGNORECASE/I 플래그를 사용하여 대소 문자를 무시하지 않는 한 대/소문자를 구분합니다. 따라서 'AND''and'와 일치하지 않습니다.

또한 VERBOSE/X 플래그를 사용하지 않으면 해당 공백이 패턴의 일부입니다. 따라서 이 아니라 'AND '을 확인합니다. 원한다면 각면에 공간이 있어야 할 것입니다 (그렇지 않으면 'band leader'이 일치 할 것입니다 ...). 실제로는 \b이 아니라 공백이 필요합니다 (그렇지 않으면 'And another thing'으로 시작하는 문장이 진행되지 않습니다. 일치). 당신이 생각하는 경우

마지막으로, 당신은 당신이 search, findall, 또는 finditer보다는 match을 사용하고 싶었 좋은 기회가있다, 당신의 패턴 및 $ 및 주위 ^ 전후 .*이 필요합니다.

그래서 :

>>> s = "These are oranges and apples and pears, but not pinapples or .." 
>>> r = re.compile(r'\bAND\b | \bOR\b | \bNOT\b', flags=re.I | re.X) 
>>> r.findall(s) 
['and', 'and', 'not', 'or'] 

Regular expression visualization

Debuggex Demo

0

이 시도 :

>>> re.findall(r"\band\b|\bor\b|\bnot\b", "These are oranges and apples and pears, but not pinapples or ..") 
['and', 'and', 'not', 'or'] 

A | B 모두의 배열을 반환

는 \ B 단어 경계

re.findall (패턴, 문자열)를 나타냅니다 경기 A 또는 B 중 하나를 의미합니다 문자열의 패턴 인스턴스

+0

'{1}'은 (는) 여기에 무엇을 추가합니까? 패턴을 지정하지 않으면 항상 패턴 자체가 하나의 사본과 일치합니다. 또한,'{n}'은'|'보다 매우 단단히 묶기 때문에, 유용하다하더라도 전체 교번이 아니라't'에만 영향을줍니다. 또한, 나는'oranges'에서'or'을, 그러므로 모든 공백과'\ b' stuff과 일치시키고 싶지 않을 것이라고 확신합니다. – abarnert

관련 문제