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



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



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


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

4950   25  

25 ответов:

строки в Python являются неизменяемые (может быть изменено). Из-за этого эффект line.replace(...) это просто создать новую строку, а не изменять старую. Вам нужно rebind (назначить) его 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. Вам придется перевести немного по-другому. кевпи упоминает об этом в комментарий на один из ответов, и это отмечено в документация 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.maketrans is используется для создания перевод таблицы, которое является строкой, содержащей символы с порядковыми значениями от 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'

у спрашивающего почти получилось. Как и большинство вещей в 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.5

re.sub('\ |\?|\.|\!|\/|\;|\:', '', line)

пример

>>> import re

>>> line = 'Q: Do I write ;/.??? No!!!'

>>> re.sub('\ |\?|\.|\!|\/|\;|\:', '', line)
'QDoIwriteNo'

объяснение

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

line = line.translate(None, " ?.!/;:")
>>> 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,'')

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

используя 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

    Ничего не найдено.