我正在尝试编写解析大型文本文件的代码。但是,为了获得所述文本文件,我通过 pdfminer 运行原始 PDF 文件。虽然这有效,但它也会返回包含许多随机空格的文本文件(见下文)
SM ITH , JO HN , PHD
1234 S N O RT H AV E
Python中是否有任何简单的方法可以仅删除某些空格以便单词不被分隔?对于上面的示例,我希望它看起来像
SMITH, JOHN, PHD
1234 S NORTH AVE
谢谢。
很可能你想要做的事情不可能做到完美,而且很难做到足以让你满意。我会在下面解释。
但很有可能你一开始就不应该这样做。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)
但是现在在SMITH
and之后的逗号前留了一个空格JOHN
。
也许你需要输入一些关于英语标点符号的信息——去掉标点符号周围的空格,然后在逗号或句号之后的空格中添加回来,引号等等。
或者……好吧,除了您之外,没有人可以知道您的数据是什么样子并弄清楚。
如果你不能想出一个好的规则,唯一的选择是建立一些复杂的启发式方法,围绕在字典中查找可能的单词并猜测哪个更有可能——这仍然不能让所有事情都正确(例如,如何你知道“B OO KM AR K”是“BOOK MARK”还是“BOOKMARK”?),但这是你能做的最好的事情。
您尝试做的事情是不可能的,例如,“DESK TOP”应该是“DESK TOP”还是“DESKTOP”?