如何.replace()只是一个单词的一部分?从字符串中提取整数?

时间:2018-04-08 00:11:33

标签: python

试图找出如何仅使用Lists,For循环和.replace()替换单词的一部分。我也正在研究如何从代码中提取一个整数以便+1并返回数字。

到目前为止,我的代码如下:

dictZero = [ "zero", "none", "nil", "null" ]
dictOne = [ "one", "won", "juan" ]
dictTwo = [ "two", "to", "too", "tu" ]
dictThree = [ "three" ]
dictFour = [ "four", "for", "fore" ]

userInput = input ( "Enter your sentence to inflate: " )

for i in userInput.split():
    for e in dictFour:
        if e in i:
            userInput = userInput.replace ( i, "five" )
    for d in dictThree:
        if d in i:
            userInput = userInput.replace ( i, "four" )
    for c in dictTwo:
        if c in i:
            userInput = userInput.replace ( i, "three" )
    for b in dictOne:
        if c in i:
            userInput = userInput.replace ( i, "two" )
    for a in dictZero:
        if a in i:
            userInput = userInput.replace ( i, "one" )
    #This seems to work but not sure how to assign it back into the Input
    if int(i):
        i = int(i) + 1
        print (i)
print ( userInput)

实施例: 输入=“我在1630年睡觉前” 输出=“Befifth我在1631年去三张床”

因此代码在大多数情况下都是我想要的。如果在列表中输入单词,则会将其替换为相应的单词。

BUT!我不能为我的生活弄清楚如何将用户输入分开一步,以取代诸如“之前”之类的单词,并使结果为“befifth”而不是第五。也许是.split()然后.join()的进一步if语句?

任何帮助或建议将不胜感激。谢谢你的时间。

1 个答案:

答案 0 :(得分:1)

你的代码在“之前”变成“五”而不是“befive”的原因是这行代码:

userInput = userInput.replace ( i, "five" )

在此上下文中,i是字符串“before”,因此您将整个单词替换为“five”。要使用的正确变量不是i,而是e,这是当前字符串“for”。

userInput = userInput.replace ( e, "five" )

现在我们得到的输出是“Befivee我在1630年三床”。注意“Befivee”中的双“e”。这是因为您已错误地在dictFour中对单词进行了排序:

dictFour = [ "four", "for", "fore" ]

因为较短的单词“for”列在较长的单词“fore”之前,代码将始终在“fore”的每个出现时替换“for”,从而在输出中给出重复的“e”。您必须重新排序列表,以便在较短的单词之前列出较长的单词:

dictFour = [ "four", "fore", "for" ]  # swap "for" and "fore"
dictTwo = [ "two", "too", "to", "tu" ]  # swap "to" and "too"

下一个问题是您在输入中处理数字:

if int(i):
    i = int(i) + 1
    print (i)
如果单词无法转换为数字,

int(i)将抛出一个ValueError,这会导致程序崩溃。即使检查通过,i = int(i) + 1也只更新i变量的值,但不会更改输入字符串中的数字。

我们修复代码的第一件事就是摆脱那些编号的列表dictZerodictOne等。每当你的名字中有一个数字超过3个变量时,那就是表示你应该将它们存储在列表或字典中。在这种情况下,由于正确排序值至关重要,我们将使用列表并对数字进行降序排序:

replacements = [('five', [ "four", "fore", "for" ]),
                ('four', [ "three" ]),
                ('three', [ "two", "too", "to", "tu" ]),
                ('two', [ "one", "won", "juan" ]),
                ('one', [ "zero", "none", "nil", "null" ]),
                ]

降序很重要,以便随后的替换不会将“一”变成“二”变成“三”变成“四”等。

有了这个,我们现在可以开始修复代码了。可能最简单的方法是将用户输入拆分为一个列表,并在该列表中执行替换:

words = userInput.split()
for i, word in enumerate(words):
    # if the word is a number, increment it
    try:
        word = str(int(word) + 1)
    except ValueError:
        # if it isn't a number, loop over all replacements and substitute them
        for replacement, words_to_replace in replacements:
            for word_to_replace in words_to_replace:
                word = word.replace(word_to_replace, replacement)

    # assign the updated word back into the list
    words[i] = word

userInput = ' '.join(words)
print(userInput)  # output: Befive I go five bed at 1631

另一种选择是直接替换输入字符串中的所有单词并使用正则表达式来增加数字:

import re

for replacement, words_to_replace in replacements:
    for word_to_replace in words_to_replace:
        userInput = userInput.replace(word_to_replace, replacement)

userInput = re.sub(r'\d+', lambda match: str(int(match.group())+1), userInput)
print(userInput)  # output: Befive I go five bed at 1631