2011-11-02 6 views
1

누군가 파이썬의 이상한 행동을 설명 할 수 있습니까? 분명히 'test'라는 문자열에는 '입찰'또는 '묻기'가 포함되지 않습니다. 이 일치하는 이유는 무엇입니까?이 파이썬이 왜 다시 일치합니까?

import re 
pat=r'[Bid|Ask]' 
reg=re.compile(pat) 
if reg.search('test'): print "matched!" 

... 와 일치하는!

답변

10

[...] 내부에 나열된 모든 문자와 일치하는 문자 클래스를 정의합니다. 원하는 것은 par = r'(Bid|Ask)'입니다.

그러나 할 모든에서 이것에 대한 정규식을 사용하지 말아야 대신 다음

if whatever in ('Bid', 'Ask'): 
    # it's one of these two 
else: 
    # it isn't 

당신이 문자열 검사 (감사 @agf)을 수행해야하는 경우 :

if any(word in whatever for word in ('Bid', 'Ask')): 
    # one of the words is in the sting whatever 
+1

+1 빠르고 정규식을 필요로하지 않고 더 나은 방법을 제안합니다. – birryree

+1

또는 부분 문자열 일치를 허용할지 여부에 따라'any (단어 'Bid', 'Ask'))의 단어가 포함될 수 있습니다. – agf

+0

아. 감사. 사실, 나는 Bid 나 Ask가 포함 된 라인을 매치 할 필요가있다. 그래서 나는 여전히 re를 사용할 필요가 있다고 생각한다. – Dave31415

2

정규식은 단순히 'B', 'i', 'd', '|', 'A', 's'및 'k'문자가 포함 된 문자 집합입니다. '테스트'에는 's'가 있습니다. 아마 당신은 무엇을 의미

는 "(입찰 | 질문)"이었다

5

[...]character class matcher입니다. 이는 세트의 모든 문자와 일치 함을 의미합니다.

r'(Bid|Ask)'과 같이 번갈아 사용할 수도 있습니다.

+0

괄호는 필요 없다. – rplnt

1

[] 대신 ()이 필요하다고 생각합니다. 그룹 Bid|Ask의 모든 단일 문자와 일치하도록 입력했으며 문자열에는 s이 포함되어 있습니다.

+0

(문자열에 * d *가 아닌 * s *가 포함되어 있습니다.) – kojiro

+0

@kojiro, 감사합니다 - 입력이 아닌 출력 문자열을보고있었습니다! –

0

정규 표현식이 B, i, d, |, A, s, k 문자 집합을 검색 중입니다. 's'는 'test'내부에서 일치합니다.

대괄호는 생략해야합니다.

또한 "Askify"와 같은 문자열을 일치시키지 않으려면 정규식을 조금 더 구체화해야합니다.

관련 문제