我有几千个经过严重分析的文本文件,它们在长度的10%到30%之间显示出一些有趣的行为。不幸的是我没有原始数据,所以我无法尝试重新解析,但是几乎每个文件都需要被(部分清除)
示例输入
text = 'The European l a n g u a g es ar e members of the same fa m i l y
. Their sep a rate e xi ste nce is a myth . F or s c i e n c e , music,
sport , etc, Europe uses the s a m e v oca bula ry. The languages o n l y d
i f f e r i n t heir grammar, their pro nu n c iation and their most common
words. Everyone realizes why a new common language would be desirable: one could
refuse to pay expensive translators.'
预期产量
'The European languages are members of the same family. Their separate existence
i s a myth. For science, music, sport, etc, Europe uses the same vocabulary. The
languages only differ in their grammar, their pronunciation and their most
common words. Everyone realizes why a new common language would be desirable:
one could refuse to pay expensive translators.'
从一种怪异的格式到另一种格式似乎没有太多规律性,也没有明确的“原因”或触发字词或符号。我注意到的一件事:奇怪格式的单词由两个空格分隔(有时在标点符号之前除外,但这是一个简单的text.replace(' ,',',')
)。
问题
如何从字符串中删除成对的双空格之间的所有空格?我认为有一个正则表达式我只是没想到...
更多信息
我不知道每个文档中有多少个奇怪的部分/字母,而且我也不知道文档的内容。我唯一可以确定的其他事项是:
我曾尝试创建一个与re.sub()
一起使用的正则表达式,但没有得到任何结果-没有匹配项(最近的尝试是(?<= )[a-z]* (.* [a-z]*)(?= )
却没有用)或替换组。
谢谢!
答案 0 :(得分:0)
如果没有模式,则有一些建议:
在建议2中,检查单词是否为单词。如果不是,则添加下一个字符并再次检查。继续这样做,直到找到一个单词。并非所有单词都适用,但“ la”和“ lan”以外的“语言”将变为“语言”。因此,即使您发现一个单词,也要继续添加字符,直到它再次变成一个单词,或者限制在16个字符左右。
使用伪代码:
将所有空格替换为一个空格以上
根据单个空格将字符串拆分为数组
遍历每个单词
检查单词是否存在英语
添加字符直到找到匹配项
移至下一个单词
如果标点符号在字符的开头或两个空格之间,则用于标点符号,则删除前一个空格字符。
答案 1 :(得分:0)
我将分三个步骤进行操作(如果您遵循可选步骤,则为五个步骤):
text.replace(' *','(@)')
(星号前三个空格)。将所有这些空间对(或两个以上空间对)转换为可以确定不会出现在文本中的标记(我以(@)
为例),如demo1所示。这是为了避免将两个(或更多)空间序列视为单个空间的序列(如下所述,我们将删除它们)text.replace(' ','')
。将所有单个空格转换为空字符串,如demo2所示。 这会在示例文本中加入许多用单个空格分隔的单词,请注意。 text.replace('\(@\)',' ')
。像demo3一样,将第一步中的所有令牌转换成单个空格。text.replace(' *([.!?]) *([A-Z])','. $1')
。如果还将所有点后都跟一个大写字符转换成一个点,再跟两个空格以及匹配的大写字符,那么您将获得更漂亮的外观。与demo4中一样。text.match(' *([,;:]) *','$1 ')')
。对其他标点符号执行相同操作,但只能使用一个空格。您可以使用sed(1)
来执行此操作,如下所示:
$ sed -e 's/ */#@#/g' \
-e 's/ //g' \
-e 's/#@#/ /g' \
-e 's/ *\([.!?]\) *\([A-Z]\)/\1 \2/g' \
-e 's/ *\([,;:]\) */\1 /g' \
<<EOF
The European l a n g u a g es ar e members of
the same fa m i l y . Their sep a rate e xi ste nce
is a myth . F or s c i e n c e , music, sport ,
etc, Europe uses the s a m e v oca bula ry. The
languages o n l y d i f f e r i n t heir
grammar, their pro nu n c iation and their most
common words. Everyone realizes why a new common
language would be desirable: one could
refuse to pay expensive translators.
EOF
TheEuropean languages are members of
the same family. Their separate existence
isamyth. For science, music, sport,
etc, Europeusesthe same vocabulary. The
languages only differ in their
grammar, their pronunciation andtheirmost
commonwords. Everyonerealizeswhyanewcommon
languagewouldbedesirable: onecould
refusetopayexpensivetranslators.
$ _
最后一个示例还将[,;:]
转换为它们加上一个空格,并对?
和!
标记进行了句子分隔。
如何从字符串中删除所有在双精度空格对之间括起来的空格?
不要考虑两个之间的 n 个空格……这与两个或多个相同,只是text.replace(' *',' ')
({{1之前的三个空格}}),或用两个或两个以上的字符串替换两个或多个空格。使用*
(在text.replace(' +',' ')'
前两个空格)也可以实现相同的目的。