Удалить определенные символы из строки в python

Я пытаюсь удалить определенные символы из строки с помощью python. Это код, который я использую прямо сейчас. К сожалению, он ничего не делает для строки.

for char in line: if char in " ?.!/;:": line.replace(char,'') 

Как это сделать правильно?

  • Лучший модуль Python для Berkeley DB?
  • Как документировать константу модуля в Python?
  • python "string" модуль?
  • Как настроить Atom для запуска скриптов Python3?
  • Notepad ++ отступы испортились
  • Контроллер TensorFlow предотвращает назначение переменных: график завершен и не может быть изменен
  • Как я могу преобразовать абсолютно массивное число в строку за разумное время?
  • Как бороться с статической типизацией Python ~?
  • 19 Solutions collect form web for “Удалить определенные символы из строки в python”

    Строки в Python неизменяемы (не могут быть изменены). Из-за этого эффект line.replace(...) заключается только в том, чтобы создать новую строку, а не изменять старую. Вам нужно перестроить (назначить) его line , чтобы эта переменная приняла новое значение, при этом эти символы были удалены.

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

    Начиная с Python 2.6 и более новых версий Python 2.x, вы можете вместо этого использовать str.translate (но читать дальше для различий Python 3):

     line = line.translate(None, '!@#$') 

    или замены регулярных выражений с помощью re.sub

     import re line = re.sub('[!@#$]', '', line) 

    Символы, заключенные в скобки, составляют класс символов . Любые символы в line которые находятся в этом классе, заменяются вторым параметром на sub : пустая строка.

    В Python 3 строки являются Unicode. Вам придется переводить немного по-другому. kevpie упоминает это в комментарии к одному из ответов, и это отмечается в документации для str.translate .

    При вызове метода translate строки Unicode вы не можете передать второй параметр, который мы использовали выше. Вы также не можете передать None в качестве первого параметра или даже таблицу переводов из string.maketrans . Вместо этого вы передаете словарь как единственный параметр. Этот словарь отображает порядковые значения символов (т. ord Результат вызова ord на них) на порядковые значения символов, которые должны их заменить, или – полезно для нас. None чтобы указать, что они должны быть удалены.

    Итак, чтобы сделать вышеупомянутый танец со строкой Unicode, вы бы назвали что-то вроде

     translation_table = dict.fromkeys(map(ord, '!@#$'), None) unicode_line = unicode_line.translate(translation_table) 

    Здесь dict.fromkeys и map используются для краткого создания словаря, содержащего

     {ord('!'): None, ord('@'): None, ...} 

    Еще проще, как говорит другой ответ , создайте словарь на месте:

     unicode_line = unicode_line.translate({ord(c): None for c in '!@#$'}) 

    * для совместимости с более ранними Pythons вы можете создать таблицу перевода «null», чтобы передать вместо None :

     import string line = line.translate(string.maketrans('', ''), '!@#$') 

    Здесь string.maketrans используется для создания таблицы трансляции , которая представляет собой просто строку, содержащую символы с порядковыми значениями от 0 до 255.

    Я пропустил здесь пункт, или это просто следующее:

     >>> string = "ab1cd1ef" >>> string.replace("1","") 'abcdef' >>> 

    Поместите его в цикл:

     >>> >>> a = "a!b@c#d$" >>> b = "!@#$" >>> for char in b: ... a = a.replace(char,"") ... >>> print a abcd >>> 
     >>> line = "abc#@!?efg12;:?" >>> ''.join( c for c in line if c not in '?:!/;' ) 'abc#@efg12' 
     line = line.translate(None, " ?.!/;:") 

    Обвиняемый почти имел это. Как и большинство вещей в Python, ответ проще, чем вы думаете.

     >>> line = "HE?.LL!/;O:: " >>> for char in ' ?.!/;:': ... line = line.replace(char,'') ... >>> print line HELLO 

    Вам не нужно делать вложенную запись if / for, но вам нужно проверить каждый символ в отдельности.

    Для обратного требования допускать определенные символы в строке можно использовать регулярные выражения с помощью оператора набора дополнений [^ABCabc] . Например, чтобы удалить все, кроме букв ascii, цифр и дефиса:

     >>> import string >>> import re >>> >>> phrase = ' There were "nine" (9) chick-peas in my pocket!!! ' >>> allow = string.letters + string.digits + '-' >>> re.sub('[^%s]' % allow, '', phrase) 'Therewerenine9chick-peasinmypocket' 

    Из документации регулярного выражения python :

    Символы, которые не входят в диапазон, можно сопоставить, дополняя набор. Если первый символ набора равен '^' , все символы, которые не находятся в наборе, будут сопоставлены. Например, [^5] будет соответствовать любому символу, кроме «5», а [^^] будет соответствовать любому символу, кроме '^' . ^ не имеет особого значения, если это не первый символ в наборе.

     >>> s = 'a1b2c3' >>> ''.join(c for c in s if c not in '123') 'abc' 

    Строки неизменны в Python. Метод replace возвращает новую строку после замены. Пытаться:

     for char in line: if char in " ?.!/;:": line = line.replace(char,'') 
     #!/usr/bin/python import re strs = "how^ much for{} the maple syrup? $20.99? That's[] ricidulous!!!" print strs nstr = re.sub(r'[?|$|.|!|a|b]',r' ',strs)#i have taken special character to remove but any #character can be added here print nstr nestr = re.sub(r'[^a-zA-Z0-9 ]',r'',nstr)#for removing special character print nestr 

    Как насчет этого:

     def text_cleanup(text): new = "" for i in text: if i not in " ?.!/;:": new += i return new 

    Вот моя совместимая с Python 2/3 версия. Поскольку перевод api изменился.

     def remove(str_, chars): """Removes each char in `chars` from `str_`. Args: str_: String to remove characters from chars: String of to-be removed characters Returns: A copy of str_ with `chars` removed Example: remove("What?!?: darn;", " ?.!:;") => 'Whatdarn' """ try: # Python2.x return str_.translate(None, chars) except TypeError: # Python 3.x table = {ord(char): None for char in chars} return str_.translate(table) 

    Ниже … без использования концепции регулярного выражения.

     ipstring ="text with symbols!@#$^&*( ends here" opstring='' for i in ipstring: if i.isalnum()==1 or i==' ': opstring+=i pass print opstring 

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

    * NB: работает с Python 3.x

     import re # Regular expression library def string_cleanup(x, notwanted): for item in notwanted: x = re.sub(item, '', x) return x line = "<title>My example: <strong>A text %very% $clean!!</strong></title>" print("Uncleaned: ", line) # Get rid of html elements html_elements = ["<title>", "</title>", "<strong>", "</strong>"] line = string_cleanup(line, html_elements) print("1st clean: ", line) # Get rid of special characters special_chars = ["[!@#$]", "%"] line = string_cleanup(line, special_chars) print("2nd clean: ", line) 

    В функции string_cleanup требуется строка x, а ваш список не указан в качестве аргументов. Для каждого элемента в этом списке элементов или шаблона, если требуется замена, это будет сделано.

    Выход:

     Uncleaned: <title>My example: <strong>A text %very% $clean!!</strong></title> 1st clean: My example: A text %very% $clean!! 2nd clean: My example: A text very clean 

    Мой метод, который я использовал бы, вероятно, будет работать не так эффективно, но он просто прост. Я могу сразу удалить несколько символов в разных положениях, используя нарезку и форматирование. Вот пример:

     words = "things" removed = "%s%s" % (words[:3], words[-1:]) 

    Это приведет к «удалению» слова «это».

    Форматирование может быть очень полезно для печати переменных в середине строки печати. Он может вставить любой тип данных, используя %, за которым следует тип данных переменной; все типы данных могут использовать % s , а float (aka decimals) и целые числа могут использовать % d .

    Нарезка может использоваться для сложного управления строками. Когда я помещаю слова [: 3] , он позволяет мне выбрать все символы в строке с начала (двоеточие перед номером, это будет означать «от начала до») до 4-го символа (он включает в себя 4-й персонаж). Причина 3 равна до 4-й позиции, потому что Python начинается с 0. Затем, когда я помещаю слово [-1:] , это означает, что второй последний символ до конца (двоеточие стоит за номером). Помещение -1 сделает Python отсчет от последнего символа, а не первого. Опять же, Python начнется с 0. Итак, слово [-1:] в основном означает «от второго последнего символа до конца строки».

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

    Если я хочу удалить несколько последовательных символов, я просто смещаю числа вокруг в [] (разрезающая часть). Или, если я хочу удалить несколько символов из разных позиций, я могу просто сэндвич собрать сразу несколько фрагментов.

    Примеры:

      words = "control" removed = "%s%s" % (words[:2], words[-2:]) 

    удалено равным «круто».

     words = "impacts" removed = "%s%s%s" % (words[1], words[3:5], words[-1]) 

    удаляется равным «макам».

    В этом случае [3: 5] означает символ в позиции 3 по символу в позиции 5 (исключая символ в конечной позиции).

    Помните, что Python начинает отсчет в 0 , так что вам тоже нужно.

    Я был удивлен, что никто еще не рекомендовал использовать встроенную функцию фильтра .

      import operator import string # only for the example you could use a custom string s = "1212edjaq" 

    Скажем, мы хотим отфильтровать все, что не является числом. Использование метода встроенного фильтра «… эквивалентно выражению генератора (элемент для элемента в iterable if function (item))» [ Python 3 Builtins: Filter ]

      sList = list(s) intsList = list(string.digits) obj = filter(lambda x: operator.contains(intsList, x), sList))) 

    В Python 3 это возвращает

      >> <filter object @ hex> 

    Чтобы получить печатную строку,

      nums = "".join(list(obj)) print(nums) >> "1212" 

    Я не уверен, насколько фильтр работает с точки зрения эффективности, но хорошо знать, как использовать при составлении списков и т. Д.

    В Python 3.5

    например,

     os.rename(file_name, file_name.translate({ord(c): None for c in '0123456789'})) 

    Чтобы удалить все число из строки

    Даже нижеприведенный подход работает

     line = "a,b,c,d,e" alpha = list(line) while ',' in alpha: alpha.remove(',') finalString = ''.join(alpha) print(finalString) 

    выход >> abcde

    вы можете использовать набор

      charlist = list(set(string.digits+string.ascii_uppercase) - set('10IO')) return ''.join([random.SystemRandom().choice(charlist) for _ in range(passlen)]) 

    Легкий re.sub с re.sub в Python 3.5

     >>> import re >>> line = 'Q: Do I write ;/.??? No!!!' >>> re.sub('\ |\?|\.|\!|\/|\;|\:', '', line) 'QDoIwriteNo' 

    объяснение

    В регулярных выражениях (regex), | это логические пробелы OR и \ escapes и специальные символы, которые могут быть действительными командами регулярных выражений. sub означает подстановку.

    Python - лучший язык программирования в мире.