Как удалить символы из строки?

#python #regex #string #replace #strip

#python #регулярное выражение #строка #заменить #Стриптиз

Вопрос:

Как удалить определенные пользователем буквы из определенного пользователем предложения в 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 букву. Если вы введете несколько букв, он просто напечатает исходное предложение. Любая помощь или рекомендации будут высоко оценены.

Комментарии:

1. Укажите пользователю определенный формат, в который он должен вводить буквы (например: «E, f, g»), после чего разделите ввод на каждую запятую, и у вас останется массив букв. Выполните итерацию по массиву и вызовите re.sub(буквы, (буква в массиве), предложение) для каждой буквы в вашем массиве.

2. Причина, по которой re.sub не работает с несколькими буквами, заключается в том, что он ищет эти буквы в определенном порядке, который их предоставляет пользователь.

3. Вы могли бы сделать что-то очень уродливое, которое работает примерно так: re.sub(str(list(letters)), "", sentence) РЕДАКТИРОВАТЬ: На самом деле, это глупая идея.

4. Как насчет «для l буквами: предложение = предложение.заменить (l, «)»? Если вы хотите удалить букву отдельно… просто удалить буквы как одно слово было бы еще проще.

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

Ответ №1:

Если я правильно понял, мы можем использовать 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 repeatn'
             'sentence = "Hello World" * 100n'
             'letters = "el"'))
print('@FailSafe solution using `re` module:',
      timeit('re.sub(str([letters]), "", sentence)',
             'import ren'
             'sentence = "Hello World" * 100n'
             'letters = "el"'))
print('@raratiru solution using `str.join` method:',
      timeit('"".join([x for x in sentence if x not in letters])',
             'sentence = "Hello World" * 100n'
             'letters = "el"'))
 

выдает на моем компьютере

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

поэтому нам, вероятно, следует дважды подумать, прежде чем использовать регулярные выражения везде и str.join использовать односимвольные str символы.

Комментарии:

1. Тбх, я никогда не думал, что такая простая задача может так сильно растопить мой мозг! Ха-ха! Я действительно думал об использовании функции dict, как у вас в «Test», Но я не знал, как на самом деле реализовать ее для удаления букв в строке. Я также пытался . подход join, но с моими текущими знаниями, который также удалит только 1 букву вместо всех входных букв.

2. @Deeface: проблема в str.join том, что он объединяет «временные» односимвольные строки, когда мы можем просто использовать встроенные методы для самой целевой строки (как в предоставленном решении), что в большинстве случаев будет более эффективным

3. @Deeface: я добавил пошаговое описание того, что делает этот код, а также сравнение с решением raratiru

4. Большое спасибо за подробное объяснение вашего решения! : D Я на самом деле пытаюсь использовать ваш подход, пока мы говорим. Также вы тайно научили меня, как тестировать решение! : D

5. @Deeface Действительно, это учебник по программированию высокого уровня. В процессе производства такое детальное мышление влияет на конечный уровень качества.

Ответ №2:

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

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

.

Редактировать:

На самом деле это лучше:

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

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

Комментарии:

1. Это работает как мечта! :O Я пробовал sentence1 = re.sub([буквы]), «, предложение), но мне никогда не приходило в голову снова определять его как str! Большое спасибо!!!

2. @Deeface Хаха, спасибо. Я предоставил редактирование. Вопрос был на самом деле забавным и приятным наверняка.

3. @FaiSafe Ха-ха, да, задача звучала так просто, но когда я на самом деле сел, чтобы попытаться пройти через это, я подумал: «Во что я ввязался !?» Я попробую ваше редактирование сейчас! : D

Ответ №3:

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

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

Ответ №4:

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

 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 /

Комментарии:

1. Это также работает очень хорошо! Большое спасибо за ответ! Строка, в которой у вас есть regex_str = ‘[‘ буквы ‘]’, имеет огромное значение.