Python最快的方法是从字符串中的间隔字母中删除单个空格

时间:2014-12-08 16:56:23

标签: python python-3.x

我有一个文档,其中包含一些我想删除的字母间隔行。

问题是,字符串不遵循所有相同的规则。所以我有一些只有一个空格,也有一些空格,还有一些空格,两个或三个空格之间的单词

示例:

"H e l l o g u y s"
"H e l l o  g u y s"
"H e l l o   g u y s"

以上所有内容都应转换为 - > "大家好"

"T h i s i s P a g e 1"  -->  "This is Page 1"

我写了一个脚本来删除每一个空格,但如果下一个字母是数字或大写则不会。它的工作几乎没问题,因为处理后的文本是德语,几乎每次单词都以大写字母开头......差不多。 无论如何,我对此并不满意。所以我问我的问题是否有一个很好的功能。

text = text.strip()                     # remove spaces from start and end
out = text
if text.count(' ') >= (len(text)/2)-1:
    out = ''
    idx = 0
    for c in text:
        if c != ' ' or re.match('[0-9]|\s|[A-Z0-9ÄÜÖ§€]', text[idx+1]) or (idx > 0 and text[idx-1] == '-'):
            out += c
        idx += 1
text = out

5 个答案:

答案 0 :(得分:2)

您可以检查单词是否是英语单词然后拆分单词。您可以使用像PyEnchant这样的专用拼写检查库。

例如:

import enchant
d = enchant.Dict("en_US")
d.check("Hello")

这将是一个很好的首发。但是“Expertsexchange”存在问题。

答案 1 :(得分:2)

不是最原始的答案,但我发现您的问题几乎与this one相符。 我已经对unutbu's answer进行了修改,稍微修改了它以使用附魔解决您的查询。如果你有任何其他字典,你可以改用它。

import enchant
d = enchant.Dict("en_US") # or de_DE

def find_words(instring, prefix = ''):
    if not instring:
        return []

    if (not prefix) and (d.check(instring)):
        return [instring]
    prefix, suffix = prefix + instring[0], instring[1:]
    solutions = []
    # Case 1: prefix in solution
    if d.check(prefix):
        try:
            solutions.append([prefix] + find_words(suffix, ''))
        except ValueError:
            pass
    # Case 2: prefix not in solution
    try:
        solutions.append(find_words(suffix, prefix))
    except ValueError:
        pass
    if solutions:            
        return sorted(solutions,
                      key = lambda solution: [len(word) for word in solution],
                      reverse = True)[0]

    else:
        raise ValueError('no solution')

inp = "H e l l o   g u y s T h i s i s P a g e 1" 
newInp = inp.replace(" ", "")

print(find_words(newInp))

输出:

['Hello', 'guys', 'This', 'is', 'Page', '1']

链接页面肯定是一些实用解决方案的良好起点。但是,我认为一个合适的解决方案应该使用n-gram。可以修改此解决方案以使用多个空格,因为它们可能表示存在单词边界。

修改 您还可以使用具有相对单词频率的字典查看Generic Human's解决方案。

答案 2 :(得分:1)

Demo

这是一种可以做到的算法。没有经过实战考验,只是一个想法。

d = ['this', 'is', 'page', 'hello', 'guys']
m = ["H e l l o g u y s", "T h i s i s P a g e 1", "H e l l o   g u y s", "H e l l o  g u y s"]
j = ''.join(m[0].split()).lower()

temp = []
fix = []


for i in j:
    temp.append(i)
    s = ''.join(temp) 

    if s in d:
        fix.append(s)       
        del temp[:]

    if i.isdigit():
        fix.append(i)

print(' '.join(fix))

打印以下内容:

this is page 1hello guys使用您提供的测试输入。

<强>扩展

您可以使用this字典,每行包含单词,将其转换为列表并从那里播放。

<强>问题

正如Martjin所说,当你遇到&#34; E x p e r t s e x c h a n e e&#34;时你会做什么?那么,在这种情况下,使用n-gram概率将是一个合适的解决方案。为此你必须研究NLP(自然语言处理),但我认为你不想走那么远。

答案 3 :(得分:1)

转换"H e l l o g u y s"可能非常困难或不在本网站的范围内。但如果您不想转换像"H e l l o g u y s"或其他字符串那样的字符串之间的空格数与字母之间的空格不同,您可以使用以下代码:

>>> import re
>>> s1="H e l l o  g u y s"
>>> s2="H e l l o   g u y s"
>>> ' '.join([''.join(i.split()) for i in re.split(r' {2,}',s2)])
'Hello guys'
>>> ' '.join([''.join(i.split()) for i in re.split(r' {2,}',s1)])
'Hello guys'

此代码使用正则表达式(' {2,}')来分割单词。将字符串从具有2个以上空格的位置拆分!

答案 4 :(得分:-2)

你不能这样做 - 有效的单词边界的表示方式与应该删除的空格相同的情况理论上与文本中根本没有空格的情况相同。

所以你可以把你的问题“减少”到在文本中重新插入单词边界空间而没有任何空格的问题 - 这也是不可能的,因为即使是包含每个有效单词的字典 - 你也没有有 - ,你可以选择贪婪的比赛并插入太少的空格,或者选择非贪婪的比赛并插入太多。