回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>无聊的背景故事:</p>
<blockquote class="spoiler">
<p> My banking reports come in .pdf and .csv formats, but the older ones are only available to me as pdf's. I wanted to save the data in the same format as the newer ones to make it easier searchable, but the pdf's were protected, and after fiddling with unlockers and pdf-to-text converters, I ended up with terribly formatted files.</p>
</blockquote>
<p>我有一个文件,其中每一行都是一个事务(比如:<code>23.12 22.12.09 Verfügung Geldautomat\t63050000 / 9000481400\tGA NR00002317 BLZ63050000 0\t22.12/14.17UHR ESELSBERGW EUR 50,00\t-50,00</code>)</p>
<p>用数字替换数据字段会产生以下顺序和分隔符:</p>
<p><code>1 2 3\t7 / 6\t5\t4\t8</code></p>
<p>但我希望它是这种格式(原始数据中不存在的字段0、9和10是静态的)</p>
<p><code>"0";"1";"3";"4";"5";"6";"7";"8";"9";"10"</code></p>
<p>这是我当前的方法(没有I/O部分)</p>
<pre><code>def readtrans(line):
d1, d2, rest = line.split(' ', 2)
d3, rest, d5, d4, d8 = rest.split('\t')
d7, d6 = rest.split(' / ')
return [d1, d2, d3, d4, d5, d6, d7, d8]
</code></pre>
<p>不幸的是,它在第一个文件的第3行崩溃,因为字段5和6对于字段3的某些值是空的。在添加了一个if子句来解决这个问题之后,脚本前进到第5行只是为了再次崩溃,因为字段4可能还包含制表符。我也可以解决这个问题,但我把它当作一个提示,去寻找一个更灵活的解决方案。在</p>
<p>大多数时候,当我需要从文本中提取数据时,我会相应地查看分隔符和<code>split()</code>。它可能不是很有效,但它比查找正则表达式语法要快,我很少使用它,而且经常忘记它。在这种情况下,这是一种可行的方法,还是regex更适合?regex甚至可以处理这个任务吗?如果是的话,它仍然是可读的吗?你会怎么解决?在</p>
<p>编辑:
确实,我再也不会使用这段代码了,(顺便说一下,这是我的解决方案),但这是一个非常常见的问题</p>
^{pr2}$
<p>在思考了如何重新表述我的问题之后,我意识到它基本上是这个问题的重复</p>
<p>有了新的知识,我编造了这个简短的模式,可以正确地解析我的示例</p>
<pre><code>import re
example = '23.12 22.12.09 Verfügung Geldautomat\t63050000 / 9000481400\tGA NR00002317 BLZ63050000 0\t22.12/14.17UHR ESELSBERGW EUR 50,00\t-50,00'
x = re.search(r'(\S+) (\S+) ([\S| ]+)\t(\S+) / (\S+)\t([\S| ]+)\t([\S| ]+)\t([\S| ]+)', example)
print x.groups()
>>>('23.12',
'22.12.09',
'Verf\xc3\xbcgung Geldautomat',
'63050000',
'9000481400',
'GA NR00002317 BLZ63050000 0',
'22.12/14.17UHR ESELSBERGW EUR 50,00',
'-50,00')
</code></pre>
<p>钥匙是用的重组()</p>