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

时间:2019-04-18 14:12:54

标签: python regex string replace strip

如何在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)

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

4 个答案:

答案 0 :(得分: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"'))

在我的PC上使用

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

所以我们可能应该在三处使用正则表达式和str.join赋予一个字符str的含义之前三思。

答案 1 :(得分:2)

您可以使用列表理解:

result = ''.join([x for x in sentence if x not in letters])

答案 2 :(得分:2)

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

最好以letters = 'abcd'的形式输入字母。如有必要,请勿使用空格或标点符号。

编辑:

这些实际上更好:

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

第一个也会删除\'(如果它是更漂亮的解决方案),即使它出现在字符串中

答案 3 :(得分:2)

您的代码无法正常工作,因为您提供的正则表达式仅与您提供的字母的确切组合匹配。您想要匹配两个字母之一,这可以通过将它们放在方括号中来实现,例如:

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/