Удалить определенные символы из строки в Python - PullRequest
456 голосов
/ 15 октября 2010

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

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

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

Ответы [ 27 ]

6 голосов
/ 25 октября 2017

Используя 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.
4 голосов
/ 22 июля 2018

Вот несколько возможных способов решения этой задачи:

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" - испанскийслово сказать летучая мышь ... смешное слово, поскольку оно содержит все гласные:)

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

Так что, кажется, try4 является самым быстрым для этого конкретного ввода.

3 голосов
/ 03 августа 2016

Вот моя 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)
3 голосов
/ 31 октября 2017
>>> # Character stripping
>>> a = '?abcd1234!!'
>>> t.lstrip('?')
'abcd1234!!'
>>> t.strip('?!')
'abcd1234'
1 голос
/ 25 мая 2014
#!/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
1 голос
/ 13 июля 2018

Вы должны переназначить переменную str:

for char in line:
if char in " ?.!/;:":
    line = line.replace(char,'')
1 голос
/ 11 августа 2015

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

* Примечание: работает с 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
1 голос
/ 24 марта 2015

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

def text_cleanup(text):
    new = ""
    for i in text:
        if i not in " ?.!/;:":
            new += i
    return new
1 голос
/ 10 июня 2016

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

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

Это приведет к тому, что слово «this» будет «удалено».

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

Нарезка может использоваться для сложного управления строками.Когда я помещаю words [: 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 , так что вам также потребуется.

0 голосов
/ 18 июня 2019

# для каждого файла в каталоге, переименуйте имя файла

   file_list = os.listdir (r"D:\Dev\Python")

   for file_name in file_list:

       os.rename(file_name, re.sub(r'\d+','',file_name))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...