Регулярное выражение: если, иначе, если, еще - PullRequest
0 голосов
/ 12 августа 2010

Я пытаюсь разобрать операторы FSM языка Gezel (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, если в примере, распознается как , если .

Ответы [ 4 ]

3 голосов
/ 12 августа 2010

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

2 голосов
/ 12 августа 2010

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


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

regex_cond = re.compile( r'.+?(else\sif|else|if).+?' )
...
# else if
1 голос
/ 12 августа 2010

Ваша непосредственная проблема в том, что .+ является жадным и поэтому соответствует @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 здесь.

0 голосов
/ 12 августа 2010

Поправьте меня, если я не прав, но RE не годятся для разбора, так как этого достаточно только для языков Type2.Например, вы не можете определить погоду или нет ((()) ())) является допустимым утверждением без «подсчета», чего не может сделать регулярное выражение.Или, чтобы рассказать о вашем примере, если еще не может быть признан недействительным.Может быть, я перепутал сканер / парсер, в этом случае, пожалуйста, скажите мне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...