簡體   English   中英

Python從字符串中隔開的字母中刪除單個空格的最快方法

[英]Python fastest way to remove single spaces from spaced out letters in string

我有一個文檔,其中某些行的行中有一些要刪除的字母。

問題是字符串不遵循所有相同的規則。 所以我有些單詞之間只有一個空格,有些單詞之間有兩個或三個空格

例子:

"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"

以上所有內容都應轉換為->“ Hello guys”

"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

您可以檢查單詞是否為英語單詞,然后拆分單詞。 您可以使用專用的拼寫檢查庫,例如PyEnchant。

例如:

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

這將是一個很好的起點。 但是“ Expertsexchange”存在問題。

不是最原始的答案,但我已經看到您的問題幾乎與這個問題吻合。 我接受了unutbu的答案 ,對其進行了一些修改,以解決附魔的問題。 如果您還有其他字典,可以改用它。

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。 也可以修改此解決方案以利用多個空格,因為它們可能表示單詞邊界的存在。

編輯:您也可以使用具有相對詞頻的字典來查看通用人的解決方案。

演示

這是可以做到的算法。 沒有經過戰斗考驗,只是一個想法。

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 ,提供您提供的測試輸入。

擴展

您可以使用詞典, 詞典的每一行都有單詞,將其轉換為列表,然后從那里開始播放。

問題

正如Martjin所建議的,遇到“ E xpertsexchange”時您會怎么做。 好吧,在這種情況下,使用n-gram概率將是一個合適的解決方案。 為此,您必須研究NLP(自然語言處理),但是我想您不想走那么遠。

在本網站的范圍內,轉換"H elloguys"可能非常困難或不容易。 但是,如果您不想轉換"H elloguys"類的字符串或其他單詞之間的空格數與字母之間的空格數不同的字符串,則可以使用以下代碼:

>>> 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個空格的地方分割字符串!

您無法執行此操作-從理論上講,有效單詞邊界與應刪除的空格的表示方式相同,而在文本中根本沒有空格的表示方式也是如此。

因此,您可以將您的問題“減少”到在根本沒有空格的文本中重新插入單詞邊界空格的問題-這同樣是不可能的,因為即使使用包含每個有效單詞的字典-您也沒有-您既可以進行貪心匹配並插入太多空格,也可以進行非貪婪匹配並插入太多空格。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM