Python pyparsing问题

时间:2015-01-14 09:34:32

标签: python pyparsing

我是python和使用pyparsing的新手,但是使用以下代码获得了一些异常

while site_contents.find('---', line_end) != line_end + 2:
        cut_start = site_contents.find(" ", site_contents.find("\r\n", start)) 
        cut_end = site_contents.find("  ", cut_start+1) 
        line_end = site_contents.find("\r\n", cut_end)
        name = site_contents[cut_start:cut_end].strip() 
        float_num = Word(nums + '.').setParseAction(lambda t:float(t[0]))
        nonempty_line = Literal(name) + Word(nums+',') + float_num + Suppress(Literal('-')) + float_num * 2 
        empty_line = Literal(name) + Literal('-') 
        line = nonempty_line | empty_line
        parsed = line.parseString(site_contents[cut_start:line_end]) 
        start = line_end 

异常

Traceback (most recent call last):
      File "D:\Ecllipse_Python\HellloWorld\src\HelloPython.py", line 108, in <module>
        parsed = line.parseString(site_contents[cut_start:line_end]) # parse line of data following cut name
      File "C:\Users\arbatra\AppData\Local\Continuum\Anaconda\lib\site-packages\pyparsing.py", line 1041, in parseString
        raise exc
    pyparsing.ParseException: Expected W:(0123...) (at char 38), (line:1, col:39)

如何解决此问题?

1 个答案:

答案 0 :(得分:0)

如果使用setName为表达式命名,您将获得更好的异常消息。从异常消息的“Expected W:(0123 ...)”部分看,解析器看起来没有找到预期的数值。但默认名称并未向我们展示足以知道预期哪种类型的数字字段。修改你的解析器以添加setName,如下所示,并更改nonempty_line的定义:

float_num = Word(nums + '.').setParseAction(lambda t:float(t[0])).setName("float_num")
integer_with_commas = Word(nums + ',').setName("int_with_commas")
nonempty_line = Literal(name) + integer_with_commas + float_num + Suppress(Literal('-')) + float_num * 2 

我还要在前面调用parseString:

print site_contents[cut_start:line_end]

至少在你调试的时候。然后,您可以将正在解析的字符串与错误消息进行比较,包括发生解析错误的列号,如发布的示例中所示“(在char 38中),(line:1,col:39)”。 “char xx”以第一个字符“char 0”开头; “col:xx”从第一列开始为“col:1”。

这些代码更改可能有助于您找出问题所在:

print "12345678901234567890123456789012345678901234567890"
print site_contents[cut_start:line_end]
try:
    parsed = line.parseString(site_contents[cut_start:line_end])
except ParseException as pe:
    print pe.loc*'  ' + '^'
    print pe

请务必在使用等宽字体的窗口中运行它(以便所有字符列对齐,并且所有字符的宽度都相同)。

完成此操作后,您可能会有足够的信息来自行解决问题,或者您可以使用更好的输出来编辑原始问题,以便我们更好地为您提供帮助。