Как удалить номера из имен? [Дубликат]

Функция:

public float simpleSimilarity(String u, String v) {
    String[] a = u.split(" ");
    String[] b = v.split(" ");

    long correct = 0;
    int minLen = Math.min(a.length, b.length);

    for (int i = 0; i < minLen; i++) {
        String aa = a[i];
        String bb = b[i];
        int minWordLength = Math.min(aa.length(), bb.length());

        for (int j = 0; j < minWordLength; j++) {
            if (aa.charAt(j) == bb.charAt(j)) {
                correct++;
            }
        }
    }

    return (float) (((double) correct) / Math.max(u.length(), v.length()));
}

Тест:

String a = "This is the first string.";

String b = "this is not 1st string!";

// for exact string comparison, use .equals

boolean exact = a.equals(b);

// For similarity check, there are libraries for this
// Here I'll try a simple example I wrote

float similarity = simple_similarity(a,b);
373
задан serv-inc 25 October 2017 в 10:59
поделиться

26 ответов

Строки в 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 на них) на порядковые значения символов, которые должны их заменить, или - полезно us- 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.

481
ответ дан Community 15 August 2018 в 23:42
поделиться
  • 1
    В Python3 line.translate принимает только один аргумент, и первое решение не будет работать – marczoid 20 November 2012 в 11:19
  • 2
    @marczoid: Спасибо, добавил к этому заметку. – intuited 20 November 2012 в 19:11
  • 3
    В python3 str.translate () не принимает второй аргумент. Итак, ваш ответ станет line.translate({ord(i):None for i in '!@#$'}) – naveen 12 January 2014 в 14:17
  • 4
    То же, что и любой другой персонаж. Python позволяет использовать пары одиночных или двойных кавычек. Поэтому вы просто пишете "'" для набора символов. – intuited 26 November 2015 в 21:14
  • 5
    Комментарий @ naveen выше работал для меня. Python 2.7.13. В моем случае я хотел снять " и 'characters: notes = notes.translate({ord(i):None for i in '\"\''}) – RyanG 14 March 2017 в 15:18

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

for char in line:
if char in " ?.!/;:":
    line = line.replace(char,'')
0
ответ дан Anastasia Churyk 15 August 2018 в 23:42
поделиться
>>> # Character stripping
>>> a = '?abcd1234!!'
>>> t.lstrip('?')
'abcd1234!!'
>>> t.strip('?!')
'abcd1234'
4
ответ дан Arihant Bansal 15 August 2018 в 23:42
поделиться
  • 1
    Удаляет только символы с начала или конца строки. – divenex 10 January 2018 в 17:52

В Python 3.5

, например,

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

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

1
ответ дан BonieSV 15 August 2018 в 23:42
поделиться

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

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

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

2
ответ дан BPL 15 August 2018 в 23:42
поделиться
  • 1
    Вы создаете ненужный list в attempt1, и кортеж может быть переписан на "aeiou" для простоты (удаление [ и ] превратится в генератор без создания списка). Вы создаете тонны промежуточных промежуточных строк в attemt2, вы используете несколько приложений regex в attempt3, где вы могли бы использовать r'[aeiou]' за один проход. у каждого есть недостатки - его приятно видеть разные способы делать что-то, но, пожалуйста, исправьте их, чтобы быть хорошими попытками – Patrick Artner 22 July 2018 в 13:08
  • 2
    @PatrickArtner Вы абсолютно правы ... из десятков способов, которые я имел в виду для достижения этой задачи, я подобрал более медленные (хотел показать OP несколько самых простых) ... Это сказало, после вас ребята закрыли другую тему, я потерял мотивацию, чтобы приложить больше усилий на эту уже отреагированную старую нить, так что ... :). Спасибо за очки. – BPL 22 July 2018 в 13:14
  • 3
    @PatrickArtner Ok ... просто ради просто добавил новую, «try4» ... не измерил, но я думаю, что нужно быть быстрее – BPL 22 July 2018 в 13:18
  • 4
    @PatrickArtner Отредактировано ... попытка4 была самой быстрой из множества попыток. Во всяком случае, я не трачу больше времени на этот материал :) – BPL 22 July 2018 в 13:39

Вот моя совместимая с 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
ответ дан Bryce Guinta 15 August 2018 в 23:42
поделиться
  • 1
    Я бы использовал dict.fromkeys(map(ord, '!@#$')) для создания карты. – Martijn Pieters♦ 8 April 2017 в 16:03
  • 2
    map, как правило, менее читается, чем понимание списка / dict / set / generator. Настолько, что Гвидо хотел удалить его с языка . Использование fromkeys также немного умнее и требует проверки документа. – Bryce Guinta 8 April 2017 в 23:21
>>> s = 'a1b2c3'
>>> ''.join(c for c in s if c not in '123')
'abc'
10
ответ дан Carles Alcolea 15 August 2018 в 23:42
поделиться
  • 1
    Мой ответ действительно дает решение первоначального вопроса, но меня также интересовало (возможно, и OP) отзывы о том, почему мое решение может быть не идеальным. Должен ли я создать новый вопрос и ссылаться на этот контекст? – eatkin 19 October 2015 в 21:05

Для обратного требования только , позволяющего определенным символам в строке, вы можете использовать регулярные выражения с помощью оператора набора дополнений [^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», а [^^] будет соответствовать любому символу, кроме '^'. ^ не имеет особого значения, если это не первый символ в наборе.

16
ответ дан cod3monk3y 15 August 2018 в 23:42
поделиться
  • 1
    как я могу удалить символ `??? ???? я не могу сделать это с помощью любого из этих способов – Arash Hatami 31 January 2016 в 09:36

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

    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"

Я не знаю, как фильтр занимает место в терминах эффективность, но хорошо знать, как использовать при составлении списков и т. д.

UPDATE

Логически, поскольку работы фильтра вы также можете использовать понимание списка и из того, что у меня есть прочитайте, что он должен быть более эффективным, потому что лямбды - это руководители хедж-фондов на уличной улице в мире функций программирования. Другим плюсом является то, что это однострочный, который не требует импорта. Например, используя ту же строку 's', определенную выше,

      num = "".join([i for i in s if i.isdigit()])

Вот и все. Возврат будет строкой всех символов, которые являются цифрами в исходной строке.

Если у вас есть определенный список допустимых / неприемлемых символов, вам нужно только отредактировать часть «если» в понимании списка.

      target_chars = "".join([i for i in s if i in some_list]) 

или, альтернативно,

      target_chars = "".join([i for i in s if i not in some_list])
5
ответ дан Dan Temkin 15 August 2018 в 23:42
поделиться

Вы также можете использовать функцию, чтобы заменить другой тип регулярного выражения или другой шаблон с использованием списка. При этом вы можете смешивать регулярное выражение, класс символов и действительно основной шаблон текста. Это действительно полезно, когда вам нужно заменить множество элементов, таких как 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 требуется ваше string 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
ответ дан Djidiouf 15 August 2018 в 23:42
поделиться
>>> line = "abc#@!?efg12;:?"
>>> ''.join( c for c in line if  c not in '?:!/;' )
'abc#@efg12'
31
ответ дан ghostdog74 15 August 2018 в 23:42
поделиться
  • 1
    Большое спасибо !! Я пытался удалить символ японской йены из строки, которую я проанализировал с помощью ответа XML http. Это решение работало и избегало многих проблем Unicode. # - - кодирование: utf-8 - - yenSymbol = ord (u '\ u00A5') cpc = '' .join (c для c в cpcWithYen, если ord (c)! = yenSymbol) – arcseldon 22 January 2014 в 14:48
  • 2
    как я могу удалить символ `??? ???? я не могу сделать это с помощью любого из этих способов – Arash Hatami 31 January 2016 в 09:37
  • 3
    использовать другой ограничитель строк, такой как '' 'или' – ASignor 1 June 2017 в 20:00

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

for char in line:
    if char in " ?.!/;:":
        line = line.replace(char,'')
7
ответ дан Greg Hewgill 15 August 2018 в 23:42
поделиться
  • 1
    Как вы можете перебирать строку и изменять ее одновременно? – eumiro 15 October 2010 в 13:40
  • 2
    @eumiro: Итерация проходит через оригинал line. – Greg Hewgill 15 October 2010 в 19:57
  • 3
    хорошо знать! Поэтому, если я перебираю массив, я перебираю исходный массив. Итерация по итератору была бы невозможна. – eumiro 15 October 2010 в 20:09

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

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

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

>>>
>>> a = "a!b@c#d$"
>>> b = "!@#$"
>>> for char in b:
...     a = a.replace(char,"")
...
>>> print a
abcd
>>>
153
ответ дан gsbabil 15 August 2018 в 23:42
поделиться
  • 1
    Это сделает копию строки в каждом цикле, что может быть нежелательно. Также это не очень хороший Python. В Python вместо этого вы будете делать следующее: for char in b: a=a.replace(char,"") – elgehelge 18 October 2014 в 15:05
  • 2
    использование пользовательских переменных, которые перекрывают системные классы, не является хорошей идеей. Лучше использовать переменную STRING вместо STR и C вместо CHAR. – Ayrat 26 August 2016 в 14:06

Это самый пифонический путь, который, я думаю, может быть.

clean_string = ''.join(dirty_string.strip(char_you_want_to_remove))

0
ответ дан Jerry Yang 15 August 2018 в 23:42
поделиться

Попробуйте следующее:

def rm_char(original_str, need2rm):
    ''' Remove charecters in "need2rm" from "original_str" '''
    return original_str.translate(str.maketrans('','',need2rm))

Этот метод хорошо работает в python 3.5.2

1
ответ дан Joseph Lee 15 August 2018 в 23:42
поделиться

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

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

output >> abcde

1
ответ дан M2skills 15 August 2018 в 23:42
поделиться

Рекурсивное разделение: s = строка; chars = символы для удаления

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!
1
ответ дан matt 15 August 2018 в 23:42
поделиться

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

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

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

16
ответ дан mgold 15 August 2018 в 23:42
поделиться
  • 1
    как я могу удалить символ `??? ???? я не могу сделать это с помощью любого из этих способов – Arash Hatami 31 January 2016 в 09:36
  • 2
    да, я знаю, возможно, слишком поздно, но должен работать, если вы избегаете этого. Например: line = line.replace ('`', '') читать: learnpythonthehardway.org/book/ex10.html – Aiyion.Prime 26 August 2016 в 12:45
line = line.translate(None, " ?.!/;:")
15
ответ дан Muhammad Alkarouri 15 August 2018 в 23:42
поделиться

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

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])

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

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

Помните, что Python начинает отсчет с 0 , поэтому вам также понадобится.

1
ответ дан oisinvg2001 15 August 2018 в 23:42
поделиться
#!/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
2
ответ дан pkm 15 August 2018 в 23:42
поделиться
  • 1
    как я могу удалить символ `??? ???? я не могу сделать это с помощью любого из этих способов – Arash Hatami 31 January 2016 в 09:36
  • 2
    Вы имеете в виду речевые знаки? re имеет обратную косую черту, чтобы избежать кода и считать ' как строку. docs.python.org/2/library/re.html – JasTonAChair 5 May 2016 в 01:04

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

ipstring ="text with symbols!@#$^&*( ends here"
opstring=''
for i in ipstring:
    if i.isalnum()==1 or i==' ':
        opstring+=i
    pass
print opstring
1
ответ дан Sadheesh 15 August 2018 в 23:42
поделиться

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

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

Пример

>>> import re

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

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

Объяснение

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

13
ответ дан Serge Stroobandt 15 August 2018 в 23:42
поделиться

Используя 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
ответ дан serv-inc 15 August 2018 в 23:42
поделиться

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

def text_cleanup(text):
    new = ""
    for i in text:
        if i not in " ?.!/;:":
            new += i
    return new
2
ответ дан Wariat 15 August 2018 в 23:42
поделиться
  • 1
    Не могли бы вы подробнее рассказать о своем решении, добавив немного подробного описания вашего решения? – abarisone 24 March 2015 в 09:18

вы можете использовать set

    charlist = list(set(string.digits+string.ascii_uppercase) - set('10IO'))
    return ''.join([random.SystemRandom().choice(charlist) for _ in range(passlen)])
1
ответ дан Xu Zhenlei 15 August 2018 в 23:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: