我是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)
如何解决此问题?
答案 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
请务必在使用等宽字体的窗口中运行它(以便所有字符列对齐,并且所有字符的宽度都相同)。
完成此操作后,您可能会有足够的信息来自行解决问题,或者您可以使用更好的输出来编辑原始问题,以便我们更好地为您提供帮助。