Эксклюзив или в регулярном выражении - PullRequest
28 голосов
/ 29 октября 2008

Нужна помощь в регулярных выражениях. Я хотел бы разработать выражение, соответствующее строке с " foo " ИЛИ " bar ", но не оба " foo " И " бар"

Если я сделаю что-то вроде ...

/((foo)|(bar))/

Это будет соответствовать " foobar ". Не то, что я ищу. Итак, как я могу сопоставить регулярное выражение только при наличии одного или другого термина?

Спасибо!

Ответы [ 13 ]

0 голосов
/ 29 октября 2008

Я пытался с Regex Coach против:

x foo y
x bar y
x foobar y

Если я проверю параметр g, то он действительно соответствует всем трем словам, потому что он ищет снова после каждого совпадения.
Если вам не нужно это поведение, вы можете привязать выражение, например, сопоставляя только по границам слова:

\b(foo|bar)\b

Предоставление большего количества контекста по проблеме (как выглядят данные) может дать лучшие ответы.

0 голосов
/ 29 октября 2008

Я не думаю, что это можно сделать с помощью одного регулярного выражения. И границы могут или не могут работать в зависимости от того, с чем вы совпадаете.

Я бы сопоставил каждое регулярное выражение и сделал XOR для результатов.

foo = re.search("foo", str) != None
bar = re.search("bar", str) != None
if foo ^ bar:
    # do someting...
0 голосов
/ 29 октября 2008

Я бы использовал что-то вроде этого. Он просто проверяет пространство вокруг слов, но вы можете использовать \b или \B для проверки границы, если вы используете \w. Это будет соответствовать "foo" или "bar", поэтому, очевидно, вам придется заменить пробел, на всякий случай. (Предполагая, что вы что-то заменяете.)

/\s((foo)|(bar))\s/
...