簡體   English   中英

替換字符串中的單詞

[英]Replacing words in string

好的,所以我有以下小功能:

def swap(inp):
    inp = inp.split()
    out = ""

    for item in inp:
        ind  = inp.index(item)
        item = item.replace("i am",    "you are")
        item = item.replace("you are", "I am")
        item = item.replace("i'm",     "you're")
        item = item.replace("you're",  "I'm")
        item = item.replace("my",      "your")
        item = item.replace("your",    "my")
        item = item.replace("you",     "I")
        item = item.replace("my",      "your")
        item = item.replace("i",       "you")
        inp[ind] = item

    for item in inp:
        ind  = inp.index(item)
        item = item + " "
        inp[ind] = item

    return out.join(inp)

盡管效率不是特別高,但是可以完成較短句子的工作。 基本上,它所做的只是交換代詞等觀點。 當我向它拋出“我愛你”這樣的字符串時,這很好,它返回“你愛我”,但是當我拋出類似以下內容時:

you love your version of my couch because I love you, and you're a couch-lover.

我得到:

I love your versyouon of your couch because I love I, and I'm a couch-lover. 

我對為什么會這樣感到困惑。 為了避免這種情況,我將字符串顯式拆分為列表。 為什么它能夠將其檢測為列表項的一部分,而不僅僅是完全匹配?

另外,略有偏離,以避免不得不發布另一個類似的問題; 如果對此解決方案破壞了此功能,逗號,句號和其他標點符號將如何處理?

它犯了一些非常令人驚訝的錯誤。 我的預期輸出是:

I love my version of your couch because you love I, and I'm a couch-lover.

之所以這樣格式化,是因為我最終希望能夠用數據庫中的單詞替換item.replace(x,y)變量。

對於此特定問題,您需要正則表達式。 基本上,遵循以下原則:

table = [
    ("I am", "you are"),
    ("I'm",  "you're"),
    ("my",   "your"),
    ("I",    "you"),
]

import re

def swap(s):
    dct = dict(table)
    dct.update((y, x) for x, y in table)
    return re.sub(
        '|'.join(r'(?:\b%s\b)' % x for x in dct),
        lambda m: dct[m.group(0)], 
        s)

print swap("you love your version of my couch because I love you, and you're a couch-lover.")
# I love my version of your couch because you love I, and I'm a couch-lover.

但是總的來說,通過字符串/ re函數進行自然語言處理充其量只是幼稚的(請注意上面的“您愛我”)。

這是一個簡單的代碼:

def swap(inp):
    inp = inp.split()
    out = []
    d1 = ['i am', 'you are', 'i\'m', 'you\'re', 'my', 'your', 'I', 'my', 'you']
    d2 = ['you are', 'I am', 'you\'re', 'I\'m', 'your', 'my', 'you', 'your', 'I']
    for item in inp:
        itm = item.replace(',','')
        if itm not in d1:
            out.append(item)
        else: out.append(d2[d1.index(itm)])
    return ' '.join(out)

    print(swap('you love your version of my couch because I love you, and you\'re a couch-lover.'))

問題在於index()replace()都可與子字符串(在您的情況下為子詞)一起使用。

看看我對另一個問題的回答: 用字典替換字符串,使用標點符號引起並發症

該答案中的代碼可用於解決您的問題。

暫無
暫無

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

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