<p>这个示例文本是列式的,所以pyparsing在这里有点过分了。
你可以写下:</p>
<pre><code>fieldslices = [slice(0,8), # dateslice
slice(58,58+8), # valueslice
]
for line in sample:
date,value = (line[x] for x in fieldslices)
print date,value.strip()
</code></pre>
<p>然后得到:</p>
^{pr2}$
<p>但是,由于您特别需要pyparsing解决方案,那么对于如此具有专栏性的东西,您可以使用<code>GoToColumn</code>类:</p>
^{3}$
<p><code>GoToColumn</code>与<code>SkipTo</code>相似,但它不是前进到表达式的下一个实例,而是前进到特定的列号(其中列号是从1开始的,而不是像字符串切片那样从0开始的)。在</p>
<p>下面是应用于示例文本的解析器:</p>
<pre><code># Normally, input would be from some text file
# infile = open(sourcefile)
# but for this example, create iterator from the sample
# text instead
sample = """\
date Not Important value NotImportant2
11.11.13 useless . useless,21 useless 2 14.21 asmdakldm
21.12.12 fmpaosmfpoamsp 4 41 ajfa9si90
""".splitlines()
infile = iter(sample)
# skip header line
next(infile)
for line in infile:
result = patt.parseString(line)
print result.dump()
print
</code></pre>
<p>印刷品:</p>
<pre><code>['11.11.13', 'useless . useless,21 useless 2 ', 14.210000000000001]
- date: 11.11.13
- value: 14.21
['21.12.12', 'fmpaosmfpoamsp 4 ', 41]
- date: 21.12.12
- value: 41
</code></pre>
<p>请注意,这些值已经从string转换为int或float类型;您可以为自己编写一个解析操作,将<code>dd.mm.yy</code>日期转换为Python日期时间。还要注意关联的结果名称是如何定义的;这些名称允许您按名称访问各个字段,如<code>print result.date</code>。在</p>
<p>我还注意到您的假设,即要获得一个或多个元素的序列,您使用了以下构造:</p>
<pre><code>anything = pp.Forward()
anything << anyword + (value | anything)
</code></pre>
<p>虽然这样做是可行的,但它会创建一个运行时代价高昂的递归表达式。pyparsing提供了一个迭代等价物<code>OneOrMore</code>:</p>
<pre><code>anything = OneOrMore(anyword)
</code></pre>
<p>或者,如果您喜欢较新的“*”运算符形式:</p>
^{8}$
<p>请扫描pyparsing API文档,这些文档包含在pyparsing的源代码发行版中,或者在线访问<a href="http://packages.python.org/pyparsing/" rel="nofollow">http://packages.python.org/pyparsing/</a>。在</p>
<p>欢迎使用Pyparsing!在</p>