2010-08-12 5 views
0

Я пытаюсь разобрать заявления FSM языка Гезеля (http://rijndael.ece.vt.edu/gezel2/) с использованием Python и регулярных выраженийРегулярного выражения: если, в противном случае, иначе

regex_cond = re.compile(r'.+((else\tif|else|if)).+') 
line2 = '@s0 else if (insreg==1) then (initx,PING,notend) -> sinitx;' 
match = regex_cond.match(line2); 

У меня есть проблемы, чтобы отличить если и еще если. else, если в примере признается , если.

+1

Разве нет \ t вкладка? Так что на самом деле он ищет еще , если вместо , если? Я бы попытался переключиться на else \ sif. – martiert

ответ

2

Не делайте этого; вместо этого используйте pyparsing. Вы поблагодарите себя позже.


Проблема заключается в том, что .+ жаден, так что это пожирая else ... сделать .+? вместо этого. Вернее, нет, потому что вы используете pyparsing.

regex_cond = re.compile(r'.+?(else\sif|else|if).+?') 
... 
# else if 
3

a \ t соответствует символу табуляции. Не похоже, что у вас есть символ табуляции между «else» и «if» в строке2. Вместо этого вы можете попробовать \ s, который соответствует любому символу пробела.

+0

Я также могу предположить, что вы можете удалить двойные скобки ((...)) и заменить одним набором (...), так как один набор будет обеспечивать как захват, так и альтернативный. –

+0

спасибо, но он по-прежнему подходит, если и не иначе, если. – mrks

+0

Правда, но не единственная проблема. – katrielalex

0

Исправьте меня, если они ошибаются, но RE не подходят для синтаксического анализа, поскольку его достаточно для языков Type2. Для exaple вы не можете решить погоду или нет ((())())) является допустимым утверждением без «подсчета», которое не может выполнять регулярное выражение. Или, чтобы поговорить о вашем примере, если другое не удалось найти недействительным. Может быть, im mixiung up сканер/парсер, в этом случае, пожалуйста, скажите мне.

+0

Разбор вложенных структур с помощью Regex был довольно хорошо сбит в [этом вопросе SO] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags). Этот вопрос связан с HTML, но одинаково хорошо относится к любым вложенным структурам – NealB

1

Ваша непосредственная проблема состоит в том, что .+ жаден и поэтому он соответствует @s0 else вместо того, чтобы просто @s0. Для того, чтобы это не жадный, используйте .+? вместо:

import re 

regex_cond = re.compile(r'.+?(else\s+if|else|if).+') 
line2 = '@s0 else if (insreg==1) then (initx,PING,notend) -> sinitx;' 
match = regex_cond.match(line2) 
print(match.groups()) 
# ('else if',) 

Однако, как и другие предложили, используя анализатор как Pyparsing это лучший способ, чем использование re здесь.

Смежные вопросы