我正在尝试使用scanString函数在文本中查找典型标记的开始和结束位置。
text = """
P: INT;
timer2.et == 3423
Q : INT ;
TIME1: TIME;
TIME2: TIME;
TIMER_Q3 : BOOL;
WECHSEL : BOOL;
m : BOOL;
timer.q = 4
"""
从此文本中,我想找到XXX.et和XXX.q令牌的位置:
import pyparsing as pp
TK_TIMER_Q_ET = pp.Word(pp.alphanums + "_") + (pp.Literal(".q") | pp.Literal(".et"))
t_end = []
t_match = []
t_start = []
for match, start, end in TK_TIMER_Q_ET.scanString(text):
t_match.append(match)
t_start.append(start)
t_end.append(end)
i = len(t_match) - 1
k = 0
while k <= i:
print("t_end=", t_end[k])
print("t_start=", t_start[k])
print("t_match=", t_match[k])
print("match=", text[t_start[k]:t_end[k]])
k += 1
作为输出,我在打印“ match = ...”时期望“ timer2.et”和“ timer.q”,但是得到:
t_end= 35
t_start= 26
t_match= ['timer2', '.et']
match= 423
Q
t_end= 189
t_start= 182
t_match= ['timer', '.q']
match=
如果有人可以帮助我解决这个问题,那就太好了!
答案 0 :(得分:1)
您缺少的是将字符分组以组成一个标识符的功能。尝试通过以下方式更改代码:
K_TIMER_Q_ET = pp.Group(pp.Word(pp.alphanums + "_") + (pp.Literal(".q") | pp.Literal(".et")))
为我工作:
('t_end=', 27)
('t_start=', 18)
('t_match=', ([(['timer2', '.et'], {})], {}))
('match=', 'timer2.et')
('t_end=', 153)
('t_start=', 146)
('t_match=', ([(['timer', '.q'], {})], {}))
('match=', 'timer.q')