Почему этот питон соответствует?

1

Может кто-то объяснить это странное поведение python re? Очевидно, что строка "test" не содержит "Bid" или "Ask". Почему это сопоставление?

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

... соответствует!

Теги:

5 ответов

10
Лучший ответ

[...] определяет класс символов, соответствующий любому символу, указанному внутри. То, что вам нужно, - 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
  • 1
    +1 за то, чтобы быть быстрее и предлагать лучший путь без необходимости в регулярных выражениях.
  • 1
    Или, возможно, any(word in text for word in ('Bid', 'Ask')) зависимости от того, хотите ли вы принять совпадения подстроки.
Показать ещё 4 комментария
5

[...] - это совпадение класса символов, что означает, что он будет соответствовать любому символу в наборе.

Вероятно, вам нужно чередование, например: r'(Bid|Ask)'.

  • 0
    Вам не нужны скобки.
2

Ваше регулярное выражение - это просто набор символов, содержащий символы "B", "i", "d", "|", "A", "s" и "k". В 'тесте' есть 's'.

То, что вы, вероятно, имели в виду, было "(Bid | Ask)"

1

Я думаю, что вы хотите () вместо []. Вы сказали, что он соответствует любому одиночному символу в группе Bid|Ask а строка содержит s.

  • 0
    (Строка содержит s , а не d .)
  • 0
    @kojiro, спасибо - я смотрел на выходную строку, а не на вход!
0

Ваше регулярное выражение выполняет поиск набора символов B, i, d, |, A, s, k. '' 'внутри' теста '.

Вы должны опустить скобки.

Также, если вы не хотите сопоставлять строки, такие как "Askify", вам нужно уточнить свое регулярное выражение еще немного.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню