Насколько я могу судить, ваши регулярные выражения эквивалентны следующему:
# This is bad, because IMPLICATION also will match every
# string that EQUIVALENCE matches
IMPLICATION = re.compile("->")
EQUIVALENCE = re.compile("<->")
Как вы уже написали, вы также подходите для нуля или более пробельных символов перед литералом ->
и <->
. Но вы не захватываете пробелы, поэтому бесполезно указывать «совпадать, есть пробелы или нет». Также обратите внимание, что в этих регулярных выражениях не нужно экранировать -
и >
.
У вас есть два варианта, как я вижу. Во-первых, убедитесь, что IMPLICATION
не соответствует тем же строкам, что и EQUIVALENCE
# This ought to work just fine.
IMPLICATION = re.compile("[^<]->")
EQUIVALENCE = re.compile("<->")
Другим вариантом является использование метода maxim munch ; то есть сопоставлять со всеми регулярными выражениями и выбирать самое длинное совпадение. Это разрешило бы двусмысленность, дав EQUIVALENCE более высокий приоритет, чем IMPLICATION.