Удаление всего, кроме буквенно-цифровых символов из строки в Python

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

Решения, представленные в PHP-варианте этого вопроса , вероятно, будут работать с некоторыми незначительными корректировками, но для меня это не кажется очень «пуфоничным».

  • Python - преобразовать строку в список
  • Получить «фактическую» длину строки в символах Юникода
  • Поиск, если две строки почти одинаковы
  • Как отсортировать буквы в строке по алфавиту в Python
  • Как определить, находится ли подстрока в другой строке
  • Округление десятичных знаков с помощью новой функции формата Python
  • Для записи я не просто хочу разбивать периоды и запятые (и другую пунктуацию), но также цитаты, скобки и т. Д.

  • Python Вход в Tkinter Text Widget
  • Java -> Python?
  • Ошибка установки пакета: невозможно импортировать имя 'unpack_url'
  • Почему добавление этого метода __init __ () нарушает мою модель Django?
  • matplotlib: изменить метки ярлыка yaxis
  • принять ssl cert с марионеткой firefox webdrive python splinter
  • 7 Solutions collect form web for “Удаление всего, кроме буквенно-цифровых символов из строки в Python”

    Я просто приурочил некоторые функции из любопытства. В этих тестах я string.printable не буквенно-цифровые символы из строки string.printable (часть встроенного string модуля).

     $ python -m timeit -s \ "import string" \ "''.join(ch for ch in string.printable if ch.isalnum())" 10000 loops, best of 3: 57.6 usec per loop $ python -m timeit -s \ "import string" \ "filter(str.isalnum, string.printable)" 10000 loops, best of 3: 37.9 usec per loop $ python -m timeit -s \ "import re, string" \ "re.sub('[\W_]', '', string.printable)" 10000 loops, best of 3: 27.5 usec per loop $ python -m timeit -s \ "import re, string" \ "re.sub('[\W_]+', '', string.printable)" 100000 loops, best of 3: 15 usec per loop $ python -m timeit -s \ "import re, string; pattern = re.compile('[\W_]+')" \ "pattern.sub('', string.printable)" 100000 loops, best of 3: 11.2 usec per loop 

    Регулярные выражения для спасения:

     import re re.sub(r'\W+', '', your_string) 

    Используйте метод str.translate () .

    Предполагая, что вы будете делать это часто:

    (1) Создайте строку, содержащую все символы, которые вы хотите удалить:

     delchars = ''.join(c for c in map(chr, range(256)) if not c.isalnum()) 

    (2) Всякий раз, когда вы хотите вырезать строку:

     scrunched = s.translate(None, delchars) 

    Стоимость установки, вероятно, выгодно отличается от re.compile; предельные издержки ниже:

     C:\junk>\python26\python -mtimeit -s"import string;d=''.join(c for c in map(chr,range(256)) if not c.isalnum());s=string.printable" "s.translate(None,d)" 100000 loops, best of 3: 2.04 usec per loop C:\junk>\python26\python -mtimeit -s"import re,string;s=string.printable;r=re.compile(r'[\W_]+')" "r.sub('',s)" 100000 loops, best of 3: 7.34 usec per loop 

    Примечание. Использование string.printable в качестве контрольных данных дает шаблон «[\ W _] +» несправедливое преимущество ; все не-буквенно-цифровые символы находятся в одном наборе … в типичных данных было бы более одной замены:

     C:\junk>\python26\python -c "import string; s = string.printable; print len(s),repr(s)" 100 '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c' 

    Вот что произойдет, если вы дадите re.sub немного больше работы, чтобы сделать:

     C:\junk>\python26\python -mtimeit -s"d=''.join(c for c in map(chr,range(256)) if not c.isalnum());s='foo-'*25" "s.translate(None,d)" 1000000 loops, best of 3: 1.97 usec per loop C:\junk>\python26\python -mtimeit -s"import re;s='foo-'*25;r=re.compile(r'[\W_]+')" "r.sub('',s)" 10000 loops, best of 3: 26.4 usec per loop 

    Вы можете попробовать:

     print ''.join(ch for ch in some_string if ch.isalnum()) 
     >>> import re >>> string = "Kl13@£$%[};'\"" >>> pattern = re.compile('\W') >>> string = re.sub(pattern, '', string) >>> print string Kl13 

    Как насчет:

     def ExtractAlphanumeric(InputString): from string import ascii_letters, digits return "".join([ch for ch in InputString if ch in (ascii_letters + digits)]) 

    Это работает, используя понимание списка, чтобы создать список символов в InputString если они присутствуют в комбинированных ascii_letters и digits . Затем он объединяет список вместе в строку.

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

     PERMITTED_CHARS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-" someString = "".join(c for c in someString if c in PERMITTED_CHARS) 
    Python - лучший язык программирования в мире.