Может кто-то объяснить это странное поведение python re? Очевидно, что строка "test" не содержит "Bid" или "Ask". Почему это сопоставление?
import re
pat=r'[Bid|Ask]'
reg=re.compile(pat)
if reg.search('test'): print "matched!"
... соответствует!
[...]
определяет класс символов, соответствующий любому символу, указанному внутри. То, что вам нужно, - par = r'(Bid|Ask)'
.
Тем не менее, вы не должны использовать regex для этого вообще, сделайте следующее вместо этого:
if whatever in ('Bid', 'Ask'):
# it 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
[...]
- это совпадение класса символов, что означает, что он будет соответствовать любому символу в наборе.
Вероятно, вам нужно чередование, например: r'(Bid|Ask)'
.
Ваше регулярное выражение - это просто набор символов, содержащий символы "B", "i", "d", "|", "A", "s" и "k". В 'тесте' есть 's'.
То, что вы, вероятно, имели в виду, было "(Bid | Ask)"
Я думаю, что вы хотите ()
вместо []
. Вы сказали, что он соответствует любому одиночному символу в группе Bid|Ask
а строка содержит s
.
Ваше регулярное выражение выполняет поиск набора символов B, i, d, |, A, s, k. '' 'внутри' теста '.
Вы должны опустить скобки.
Также, если вы не хотите сопоставлять строки, такие как "Askify", вам нужно уточнить свое регулярное выражение еще немного.
any(word in text for word in ('Bid', 'Ask'))
зависимости от того, хотите ли вы принять совпадения подстроки.