python pyparsing scanString-错误的开始/结束位置

时间:2018-06-19 14:51:39

标签: python-3.x pyparsing

我正在尝试使用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= 

如果有人可以帮助我解决这个问题,那就太好了!

1 个答案:

答案 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')