Удалить определенные символы из строки в Python
Я пытаюсь удалить определенные символы из строки с помощью Python. Это код, который я использую прямо сейчас. К сожалению, он, кажется, ничего не делает со строкой.
for char in line:
if char in " ?.!/;:":
line.replace(char,'')
Как мне это сделать правильно?
25 ответов:
строки в Python являются неизменяемые (может быть изменено). Из-за этого эффект
line.replace(...)это просто создать новую строку, а не изменять старую. Вам нужно rebind (назначить) егоlineдля того, чтобы эта переменная приняла новое значение, с этими символами удалены.кроме того, то, как вы это делаете, будет довольно медленным, относительно. Это также, вероятно, будет немного запутанным для опытных питонаторов, которые увидит двунаправленную структуру и на мгновение подумает, что происходит что-то более сложное.
начиная с Python 2.6 и новее Python 2.X версии * вы можете использовать
str.translate(но читайте дальше для Python 3 отличия):line = line.translate(None, '!@#$')или замена регулярного выражения на
re.subimport re line = re.sub('[!@#$]', '', line)символы, заключенные в скобки, составляют класс персонажа. Любые символы в
lineкоторые находятся в этом классе заменяются вторым параметром наsub: пустую строку.в Python 3 строки являются Unicode. Вам придется перевести немного по-другому. кевпи упоминает об этом в комментарий на один из ответов, и это отмечено в документация
str.translate.при вызове
translateметод строки Unicode, вы не можете передать второй параметр, который мы использовали выше. Вы также не можете пройтиNoneв качестве первого параметра, или даже таблица перевода изstring.maketrans. Вместо этого, вы передаете словарь в качестве единственного параметра. Этот словарь отображает порядковые номера символов (т. е. результат вызова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.maketransis используется для создания перевод таблицы, которое является строкой, содержащей символы с порядковыми значениями от 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 >>>
у спрашивающего почти получилось. Как и большинство вещей в Python, ответ проще, чем вы думаете.
>>> line = "H E?.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', и[^^]будет соответствовать любому символу, за исключением'^'.^не имеет особого значения, если это не первый символ в набор.
легкий peasy с
re.subв Python 3.5re.sub('\ |\?|\.|\!|\/|\;|\:', '', line)пример
>>> import re >>> line = 'Q: Do I write ;/.??? No!!!' >>> re.sub('\ |\?|\.|\!|\/|\;|\:', '', line) 'QDoIwriteNo'объяснение
на регулярные выражения (выражение),
|является логическим или и\экранированные пробелы и специальные символы, которые могут быть команды регулярного выражения.subозначает замену.
строки неизменяемы в Python. Элемент
replaceметод возвращает новую строку после замены. Попробуйте:for char in line: if char in " ?.!/;:": line = line.replace(char,'')
используя
filter, вам просто нужна одна строкаline = filter(lambda char: char not in " ?.!/;:", line)Это рассматривает строку как итерацию и проверяет каждый символ, если
lambdaвозвращаетTrue:>>> help(filter) Help on built-in function filter in module __builtin__: filter(...) filter(function or None, sequence) -> list, tuple, or string Return those items of sequence for which function(item) is true. If function is None, return the items that are true. If sequence is a tuple or string, return the same type, else return a list.
вот мой 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)
>>> # Character stripping >>> a = '?abcd1234!!' >>> t.lstrip('?') 'abcd1234!!' >>> t.strip('?!') 'abcd1234'
вот несколько возможных способов достижения этой задачи:
def attempt1(string): return "".join([v for v in string if v not in ("a", "e", "i", "o", "u")]) def attempt2(string): for v in ("a", "e", "i", "o", "u"): string = string.replace(v, "") return string def attempt3(string): import re for v in ("a", "e", "i", "o", "u"): string = re.sub(v, "", string) return string def attempt4(string): return string.replace("a", "").replace("e", "").replace("i", "").replace("o", "").replace("u", "") for attempt in [attempt1, attempt2, attempt3, attempt4]: print(attempt("murcielago"))PS: вместо использования " ?.!/ ;: "в примерах используются гласные... и да, "murcielago" - это испанское слово, чтобы сказать bat... смешное слово, так как оно содержит все гласные:)
PS2: если вас интересует производительность, вы можете измерить эти попытки с помощью простого кода, например:
import timeit K = 1000000 for i in range(1,5): t = timeit.Timer( f"attempt{i}('murcielago')", setup=f"from __main__ import attempt{i}" ).repeat(1, K) print(f"attempt{i}",min(t))В моей коробке вы получите:
attempt1 2.2334518376057244 attempt2 1.8806643818474513 attempt3 7.214925774955572 attempt4 1.7271184513757465Так что, кажется, attempt4 является самым быстрым для этого конкретного вход.
#!/usr/bin/python import re strs = "how^ much for{} the maple syrup? .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
вы также можете использовать функцию для того, чтобы заменить другой вид регулярного выражения или другие модели с использованием списка. При этом вы можете смешивать регулярное выражение, класс символов и действительно базовый текстовый шаблон. Это действительно полезно, когда вам нужно заменить много элементов, таких как 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 и ваш список notwanted в качестве аргументов. Для каждого элемента в этом список элементов или шаблон, если требуется замена это будет сделано.
вывод:
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, и поплавки (ака десятичные числа) и целые числа могут использовать %d.
для нарезки может использоваться для сложного контроля над строками. Когда я ставлю слова[:3], это позволяет мне выбрать все символы в строке от начала (двоеточие перед числом, это будет означать "от начала до") до 4-го символа (он включает в себя 4-й символ). Причина 3 равна до 4-й позиции потому что Python начинается с 0. Тогда, когда я ставлю word[-1:], это означает 2-й последний символ до конца (двоеточие находится за номером). Если поставить -1, то Python будет отсчитываться от последнего символа, а не от первого. Опять же, Python будет начинаться с 0. Итак,word[-1:] в основном означает 'из Второго последнего символа до конца строки.
Итак, отрезая символы перед символом, который я хочу удалить, а символы после и зажимая их вместе, я могу удалить нежелательный характер. думай об этом как о сосиске. в середине он грязный, поэтому я хочу избавиться от него. Я просто отрезал два конца, которые я хочу, а затем сложил их вместе без нежелательной части посередине.
Если я хочу удалить несколько последовательных символов, я просто сдвинуть числа вокруг в [] (нарезка части). Или если я хочу удалить несколько символов из разных позиций, я могу просто сэндвич вместе несколько ломтиков однажды.
примеры:
words = "control" removed = "%s%s" % (words[:2], words[-2:])удалены равно 'круто'.
words = "impacts" removed = "%s%s%s" % (words[1], words[3:5], words[-1])удалены равно 'macs'.
В этом случае [3:5] означает символ в позиция 3 через знак в позиция 5 (исключая символ в конечной позиции).
помните, что Python начинает отсчет с 0, так что вам тоже нужно будет.
вы должны переназначить переменную str:
for char in line: if char in " ?.!/;:": line = line.replace(char,'')
ниже.. без использования концепции регулярного выражения..
ipstring ="text with symbols!@#$^&*( ends here" opstring='' for i in ipstring: if i.isalnum()==1 or i==' ': opstring+=i pass print opstring
В Python 3.5
например,
os.rename(file_name, file_name.translate({ord(c): None for c in '0123456789'}))чтобы удалить все число из строки
вы можете использовать set
charlist = list(set(string.digits+string.ascii_uppercase) - set('10IO')) return ''.join([random.SystemRandom().choice(charlist) for _ in range(passlen)])
попробуй это:
def rm_char(original_str, need2rm): ''' Remove charecters in "need2rm" from "original_str" ''' return original_str.translate(str.maketrans('','',need2rm))этот метод хорошо работает в Python 3.5.2
рекурсивное разбиение: s=строка; символы=символы для удаления
def strip(s,chars): if len(s)==1: return "" if s in chars else s return strip(s[0:int(len(s)/2)],chars) + strip(s[int(len(s)/2):len(s)],chars)пример:
print(strip("Hello!","lo")) #He!
даже ниже подход работает
line = "a,b,c,d,e" alpha = list(line) while ',' in alpha: alpha.remove(',') finalString = ''.join(alpha) print(finalString)выход > > abcde
Comments