Как удалить символы из строки? - PullRequest
3 голосов
/ 18 апреля 2019

Как удалить пользовательские буквы из пользовательского предложения в 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 ]

3 голосов
/ 18 апреля 2019

Если я правильно понял, мы можем использовать str.maketrans и str.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.join односимвольных str ings.

2 голосов
/ 18 апреля 2019

Ваш код не работает должным образом, поскольку предоставленное вами регулярное выражение соответствует только точной комбинации букв, которые вы ему даете. Вам нужно сопоставить одну из букв, чего можно достичь, заключив их в квадратные скобки, например:

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/

2 голосов
/ 18 апреля 2019
>>> sentence1 = re.sub(str([letters]), '', sentence)

Желательно с буквами, введенными в форму letters = 'abcd'. Без пробелов и знаков препинания при необходимости.

.

Edit:

Это на самом деле лучше:

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

Первый также удаляет \', если он появляется в строке, хотя это более симпатичное решение

2 голосов
/ 18 апреля 2019

Вы можете использовать понимание списка:

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