如何从字符串中删除字符?

3
如何在Python中从用户定义的句子中删除用户定义的字母?
您好,如果有人愿意花时间帮助我编写一些Python代码。
我目前正在参加软件工程训练营,当前要求是创建一个程序,其中用户输入一个句子,然后用户将输入他/她希望从该句子中删除的字母。
我已经在网上搜索了很多关于从字符串中删除字母的文章和线程,但我找不到关于如何从用户定义的字符串中删除用户定义的字母的任何文章或线程。
import re
sentence = input("Please enter a sentence: ")
letters = input("Please enter the letters you wish to remove: ")
sentence1 = re.sub(letters, '', sentence)
print(sentence1)

预期结果应该从用户定义的字符串中删除多个字母,但如果只输入一个字母,则会删除一个字母。如果输入多个字母,则仅打印原始句子。如有帮助或指导,将不胜感激。

2
re.sub不能处理多个字母的原因是它按照用户提供的特定顺序搜索这些字母。 - Niklas7
@Niklas7 非常感谢您的回复!让我快速尝试一下,看看我能得出什么结论! :D - Deeface
@HampusLarsson 哈哈,是啊,我几乎可以在脑海中想象出结果,但我会尝试一下,看看它的效果如何:D 非常感谢! - Deeface
@meissner_ 您的建议可能真的可行!我也会快速尝试一下,看看是否成功!:D - Deeface
1
我添加了一个简单基准测试,以便每个人都可以看到使用正则表达式和“str”方法之间的区别。 - Azat Ibrakov
显示剩余4条评论
5个回答

3

如果我理解正确,我们可以在这里使用str.maketransstr.translate方法,例如:

from itertools import repeat

sentence1 = sentence.translate(str.maketrans(dict(zip(letters, repeat(None)))))

逐行解释这段代码的作用:

  • 创建字母到None的映射,将被解释为“删除此字符”

    translation_mapping = dict(zip(letters, repeat(None))
    
  • 从中创建翻译表

    translation_table = str.maketrans(translation_mapping)
    
  • 使用给定的str进行翻译

    sentence1 = sentence.translate(translation_table)
    

测试

>>> sentence = 'Some Text'
>>> letters = 'te'
>>> sentence.translate(str.maketrans(dict(zip(letters, repeat(None)))))
'Som Tx'

比较

from timeit import timeit
print('this solution:',
      timeit('sentence.translate(str.maketrans(dict(zip(letters, repeat(None)))))',
             'from itertools import repeat\n'
             'sentence = "Hello World" * 100\n'
             'letters = "el"'))
print('@FailSafe solution using `re` module:',
      timeit('re.sub(str([letters]), "", sentence)',
             'import re\n'
             'sentence = "Hello World" * 100\n'
             'letters = "el"'))
print('@raratiru solution using `str.join` method:',
      timeit('"".join([x for x in sentence if x not in letters])',
             'sentence = "Hello World" * 100\n'
             'letters = "el"'))

在我的电脑上显示

this solution: 3.620041800000024
@FailSafe solution using `re` module: 66.5485033
@raratiru solution using `str.join` method: 70.18480099999988

因此,在任何地方使用正则表达式和将单个字符的 str 连接起来,我们都应该三思而后行。


说实话,我从未想过一个听起来如此简单的任务会让我这么头疼!哈哈!我其实考虑过像你在“测试”中使用的dict函数。但我不知道如何实际实现它来删除字符串中的字母。我还尝试了.join方法,但根据我的当前知识,这也只能剥离一个字母而不是所有输入字母。 - Deeface
@Deeface:str.join 的问题在于它会将“临时”的单字符字符串连接起来,而我们可以直接在目标字符串本身上使用内置方法(就像提供的解决方案中一样),这在大多数情况下会更有效率。 - Azat Ibrakov
@Deeface:我已经添加了这段代码的逐步说明,并与raratiru的解决方案进行了比较。 - Azat Ibrakov
非常感谢您对解决方案的详细说明! :D 我正在尝试您的方法。同时,您还私下教会了我如何对解决方案进行基准测试! :D - Deeface
@Deeface 确实,这是一篇高级编程教程。在生产环境中,这种详细的思维方式会对最终的质量水平产生重大影响。 - raratiru

2
你可以使用列表推导式:

最初的回答:

你可以使用列表推导式:
result = ''.join([x for x in sentence if x not in letters])

2
>>> sentence1 = re.sub(str([letters]), '', sentence)

最好是以letters = 'abcd'的形式输入字母,如果必要,不要有空格或标点符号。

.

编辑:

这些实际上更好:

>>> re.sub('['+letters+']', '', sentence)
>>> re.sub('['+str(letters)+']', '', sentence)

最初的回答还会从字符串中移除\',虽然这可能是更好的解决方案。


这个像梦一样好用!:O 我之前尝试过 sentence1 = re.sub([letters]), '', sentence),但我从未想过再次定义它为字符串!非常感谢!!! - Deeface
@Deeface 哈哈,谢谢。我提供了一份编辑。这个问题确实很有趣和愉快。 - FailSafe
1
@FaiSafe 哈哈,是啊,这个任务听起来很简单,但当我真正坐下来尝试去完成它时,我就像是在问自己“我到底陷入了什么?”现在我会尝试你的编辑!:D - Deeface

2

你的代码无法按预期工作,因为你提供的正则表达式只匹配你给定的字母组合。你想要匹配其中的任意一个字母,可以通过将它们放在方括号中来实现,例如:

Original Answer翻译成"最初的回答"

import re
sentence = input("Please enter a sentence: ")
letters = input("Please enter the letters you wish to remove: ")
regex_str = '[' + letters + ']'
sentence1 = re.sub(regex_str, '', sentence)
print(sentence1)

如果需要更多正则表达式的帮助,建议访问https://regex101.com/

最初的回答

这也非常有效!非常感谢您的回复!您设置regex_str = '[' + letters + ']'的那一行产生了巨大的影响。 - Deeface

-1
user_word = input("What is your prefered sentence?  ")  

user_letter_to_remove = input("which letters would you like to delete? ")

#list of letter to remove

letters =str(user_letter_to_remove)

for i in letters:
    user_word = user_word.replace(i,"")

print(user_word)

你好,请查看 https://meta.stackoverflow.com/editing-help 谢谢! - Eric Aya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接