2013-10-04 124 views
1

我正在尝试编写解析大型文本文件的代码。但是,为了获得所述文本文件,我通过pdfminer运行原始PDF文件。虽然这个工作,它也返回了许多随机的空间我的文本文件(见下文)删除python中的空格

SM ITH , JO HN , PHD 
1234 S N O RT H AV E 

有没有在Python没有简单的方法这样的话是不分离的,只除去一定的空间?对于上面的示例,我希望它看起来像

SMITH, JOHN, PHD 
1234 S NORTH AVE 

谢谢。

+3

什么是规则告诉你在'S'和'N'之间留一个空格,但删除'N'和'O'之间的空格? – abarnert

+0

不,因为要确定要删除哪些空格来创建“单词”的算法,它需要理解这些单词。 PDF是图像而不是基于字形的? –

回答

3

很可能你想要做的事情是不可能做到完美的,而且很难做得足够好来满足你。我会在下面解释。

但是,有一个很好的机会,你不应该在一开始做。 pdfminer是高度可配置的,并且类似于只指定较小的-M值将首先给你想要的文本。你需要做一些试验和错误,但是如果这样做,它会比事后处理事情容易得多。


如果你想做到这一点,你需要拿出确定哪些空间是“随机多余的空格”,哪些是真正的空间,然后才能在Python代码的规则。我不知道有这样的规则。

在你的例子中,你可以处理大多数只需将多个空格变成单个空格,单个空格变成空白。应该很明显如何做到这一点。即使你不能想到一个聪明的解决方案中,三取代正常工作:

s = re.sub(r'\s\s+', r'<space>', s) 
s = re.sub(r'\s', r'', s) 
s = re.sub(r'<space>', r' ', s) 

然而,这条规则是不完全正确的,因为在JO HN , PHD,逗号后的空间不是随机的额外空间,但它不会显示为两个或更多的空间。 “1234 S”中的空间也一样。而且,很可能,对于您的真实数据,在许多其他情况下也是如此。

一个不同的有点接近的规则是,你只能删除字母之间的单个空格。再说一遍,如果可行,编码很容易。例如:

s = re.sub(r'(\w)\s(\w)', r'\1\2', s) 

S =应用re.sub(R '\ S +',R””,S)

但现在离开SMITHJOHN后的逗号之前的空间。

也许你需要投入约英文标点,带一点点信息标点前后的空间,然后重新添加在空格的逗号或句号后,各地报价等

或者......好了,任何人,但你可以知道你的数据是什么样的,并弄清楚。


如果你不能拿出一个好的规则,唯一的选择是建立一个围绕在字典中查找可能的单词和猜测哪一个更容易,这仍然不会得到一些启发复杂一切都正确(例如,你怎么知道“B OO KM AR K”是“BOOK MARK”还是“BOOKMARK”?),但这是你可能做到的最好的。

0

你想做的事情是不可能的,例如,“桌面顶部”应该是“桌面顶部”还是“桌面”?