2011-11-02 69 views
1

有人可以解释这种奇怪的python行为吗?显然,字符串'test'不包含'Bid'或'Ask'。为什么匹配?为什么这个python重新匹配?

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(word中的单词('Bid','Ask'))'。 – agf

+0

啊。谢谢。实际上,我需要匹配任何包含Bid或Ask的行,所以我认为我仍然需要使用re。 – Dave31415

2

您的正则表达式只是一个包含字符'B','i','d','|','A','s'和'k'的字符集。 '测试'中有's'。

什么你大概的意思是“(竞标| ASK)”

5

[...]character class matcher,这意味着它将匹配集合中的任何字符。

你可能想要改变,像这样:r'(Bid|Ask)'

+0

你不需要括号。 – rplnt

1

我想你想要()而不是[]。您已经告诉它匹配组Bid|Ask中的任何单个字符,而字符串包含s

+0

(该字符串包含* s *,而不是* d *。) – kojiro

+0

@kojiro,谢谢 - 我正在查看输出字符串,而不是输入! –

0

您的正则表达式正在搜索字符集B,i,d,|,A,s,k。 '''匹配'测试'内。

您应该省略括号。

另外,如果您不想匹配“Askify”等字符串,则需要再修正一下正则表达式。