Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 17, 2009 21:26:06

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Регулярные выражения

Квадратную скобку надо экранировать. Она же часть синтаксиса регулярных выражений.

Офлайн

#2 Ноя. 23, 2009 18:59:31

lightcaster
От:
Зарегистрирован: 2008-07-01
Сообщения: 31
Репутация: +  0  -
Профиль   Отправить e-mail  

Регулярные выражения

Набросал вариант с использованием PLY.
Правда, упрощенный, экспоненциальное представление не обрабатывает. Но с секциями :).

# -*- coding: utf-8
from ply import lex
from ply import yacc

raw = '#sec x =-12.57 y=2203 z=337.304 #sec abc=232'

tokens = ('SEC', 'VAR', 'DIG', 'EQ', 'SIG', 'DOT')
t_VAR = r'[a-z_]+'
t_EQ = r'='
t_DIG = r'[0-9]+'
t_SEC = r'\#sec'
t_SIG = r'[+-]'
t_DOT = '.'
t_ignore = ' \t'

def t_error(t):
print "Parse error at '%s'" % t.value

def p_product(p):
"""
prod : prod sec
prod : sec
"""
if len(p) == 2: p[0] = [p[1]]
if len(p) == 3: p[0] = p[1] + [p[2]]

def p_sec(p):
"""
sec : SEC
| sec expr
"""
if len(p) == 2: p[0] = []
if len(p) == 3: p[0] = p[1] + [p[2]]

def p_expr(p):
"""
expr : VAR EQ num
"""
p[0] = (p[1], p[3])

def p_num(p):
"""
num : DIG
| SIG num
| DIG DOT DIG
"""
if len(p) == 2: p[0] = p[1]
if len(p) == 3: p[0] = p[1] + p[2]
if len(p) == 4: p[0] = p[1] + p[2] + p[3]

def p_error(p):
print "Syntax error at '%s'" % p.value

lexer = lex.lex()
parser = yacc.yacc()
print parser.parse(raw)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version