Помогите построить регулярное выражение в Python, используя модуль re - PullRequest
1 голос
/ 05 февраля 2009

я пишу простой синтаксический анализатор формул высказываний на python, который использует модуль регулярных выражений и модуль lex / yacc для лексирования / синтаксического анализа. Первоначально мой код мог выбрать значение как ->, но добавление логической эквивалентности (<->) вызвало проблемы с скомпилированными выражениями

IMPLICATION = re.compile('[\s]*\-\>[\s]*')
EQUIVALENCE = re.compile('[\s]*\<\-\>[\s]*')
...
elif self.IMPLICATION.search(formula[0].strip()):
...
elif self.EQUIVALENCE.search(formula[0].strip()):
...

Первоначально я пытался добавить [^ <] в начало ->, чтобы он игнорировал случаи эквивалентности, но это просто заставляло его вообще не принимать никаких примеров импликации. Любая возможная помощь будет тепло приветствоваться:)

Ответы [ 2 ]

4 голосов
/ 05 февраля 2009

Насколько я могу судить, ваши регулярные выражения эквивалентны следующему:

# 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.

0 голосов
/ 05 февраля 2009

Я думаю, что вы можете решить эту проблему, просто переупорядочив проверку, чтобы сначала найти соответствия, а затем следствия. Тем не менее, это похоже на работу:

>>> IMPLICATION = re.compile(r'\s*[^\<]\-\>\s*')
>>> EQUIVALENCE = re.compile(r'\s*\<\-\>\s*')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...