我有一个包含姓名和年龄的文件,
john 25
bob 30
john bob 35
这是我到目前为止所拥有的
from pyparsing import *
data = '''
john 25
bob 30
john bob 35
'''
name = Word(alphas + Optional(' ') + alphas)
rowData = Group(name +
Suppress(White(" ")) +
Word(nums))
table = ZeroOrMore(rowData)
print table.parseString(data)
我期望的输出是
[['约翰', 25], ['鲍勃', 30], ['约翰鲍勃', 35]]
这是堆栈跟踪
Traceback (most recent call last):
File "C:\Users\mccauley\Desktop\client.py", line 11, in <module>
eventType = Word(alphas + Optional(' ') + alphas)
File "C:\Python27\lib\site-packages\pyparsing.py", line 1657, in __init__
self.name = _ustr(self)
File "C:\Python27\lib\site-packages\pyparsing.py", line 122, in _ustr
return str(obj)
File "C:\Python27\lib\site-packages\pyparsing.py", line 1743, in __str__
self.strRepr = "W:(%s)" % charsAsStr(self.initCharsOrig)
File "C:\Python27\lib\site-packages\pyparsing.py", line 1735, in charsAsStr
if len(s)>4:
TypeError: object of type 'And' has no len()
最佳答案
pyparsing
自动消除空格,以便您可以编写更清晰的语法。因此,您的名称解析器应该更像是:
# Parse for a name with an optional surname
# Note that pyparsing is built to accept "john doe" or "john doe"
name = Word(alphas) + Optional(Word(alphas))
然后,行解析器:
# Parses a row of a name and an age
row = Group(name) + Word(nums)
不过,您会得到一个相当复杂的结构,每行都有 ([(['john', 'doe'], {}), '25'], {})
,但我希望您能了解如何使用它。我建议不要真正使用 pyparsing 来解析整个字符串,而是迭代地逐行解析它,如果您的数据是基于行的。我认为让事情变得更简单:
for line in input_string.splitlines():
results = row.parseString(line)
# Do something with results...
关于python - 使用 pyparsing 解析名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13073259/