Python regexp удалить все кроме цифр

Удалить символы, кроме цифр из строки, используя Python?

Как я могу удалить все символы, кроме чисел, из строки?

В Python 2. * самым быстрым подходом является метод .translate :

>>> x='aaa12333bb445bb54b5b52' >>> import string >>> all=string.maketrans('','') >>> nodigs=all.translate(all, string.digits) >>> x.translate(all, nodigs) '1233344554552' >>> 

string.maketrans создает таблицу трансляции (строку длиной 256), которая в этом случае такая же, как ».join(chr(x) for x in range(256)) (только быстрее сделать;-). .translate применяется таблица перевода (которая здесь не имеет значения, поскольку all по существу означает идентификатор) И удаляет символы, присутствующие во втором аргументе – ключевую часть.

.translate работает по-разному в строках Unicode (и строки в Python 3 – я do) задают вопросы, которые интересуют основной выпуск Python!) – не совсем это просто, не совсем так быстро, хотя все еще вполне можно использовать.

Назад к 2. *, разница в производительности впечатляет…:

$ python -mtimeit -s'import string; all=string.maketrans("", ""); nodig=all.translate(all, string.digits); x="aaa12333bb445bb54b5b52"' 'x.translate(all, nodig)' 1000000 loops, best of 3: 1.04 usec per loop $ python -mtimeit -s'import re; x="aaa12333bb445bb54b5b52"' 're.sub(r"\D", "", x)' 100000 loops, best of 3: 7.9 usec per loop 

Ускорение вещей в 7-8 раз вряд ли будет арахисами, поэтому метод translate стоит знать и использовать. Другой популярный подход, отличный от RE…:

$ python -mtimeit -s'x="aaa12333bb445bb54b5b52"' '"".join(i for i in x if i.isdigit())' 100000 loops, best of 3: 11.5 usec per loop 

на 50% медленнее, чем RE, поэтому подход .translate превосходит его на порядок.

В Python 3 или для Unicode вам нужно передать .translate сопоставление (с ординалами, а не с символами напрямую, как ключи), который возвращает None для того, что вы хотите удалить. Здесь удобный способ выразить это для удаления “всего, кроме” нескольких символов:

import string class Del: def __init__(self, keep=string.digits): self.comp = dict((ord(c),c) for c in keep) def __getitem__(self, k): return self.comp.get(k) DD = Del() x='aaa12333bb445bb54b5b52' x.translate(DD) 

также испускает ‘1233344554552’ . Однако, помещая это в xx.py, мы имеем…:

$ python3.1 -mtimeit -s'import re; x="aaa12333bb445bb54b5b52"' 're.sub(r"\D", "", x)' 100000 loops, best of 3: 8.43 usec per loop $ python3.1 -mtimeit -s'import xx; x="aaa12333bb445bb54b5b52"' 'x.translate(xx.DD)' 10000 loops, best of 3: 24.3 usec per loop 

…, который показывает, что преимущество производительности исчезает для таких задач “удаления” и становится снижением производительности.

Читайте также:  jQuery Change CSS display Property to none or block

Используйте re.sub , например:

>>> import re >>> re.sub("\D", "", "aas30dsa20") '3020' 

\D соответствует любому несимметричному символу, поэтому код выше, по существу, заменяет каждый незнаковый символ для пустой строки.

Или вы можете использовать filter , например (в Python 2k):

>>> filter(lambda x: x.isdigit(), "aas30dsa20") '3020' 

Так как в Python 3k, filter возвращает итератор вместо list , вы можете использовать следующее:

>>> ''.join(filter(lambda x: x.isdigit(), "aas30dsa20")) '3020' 
s=''.join(i for i in s if i.isdigit()) 

Другой вариант генератора.

Вы можете использовать фильтр:

filter(lambda x: x.isdigit(), "dasdasd2313dsa") 

На python3.0 вы должны присоединиться к этому (kinda ugly:()

''.join(filter(lambda x: x.isdigit(), "dasdasd2313dsa")) 
''.join(i for i in s if i.isdigit()) 

Вы можете легко сделать это с помощью Regex

>>> import re >>> re.sub("\D","","£70,000") 70000 
x.translate(None, string.digits) 

удалит все цифры из строки. Чтобы удалить буквы и сохранить цифры, сделайте следующее:

x.translate(None, string.letters) 

В комментариях упоминается, что он хочет сохранить десятичное место. Это можно сделать с помощью метода re.sub(в соответствии со вторым и лучшим ответом IMHO), явно перечисляя символы, чтобы сохранить, например,

>>> re.sub("[^0123456789\.]","","poo123.4and5fish") '123.45' 

Быстрая версия для Python 3:

# xx3.py from collections import defaultdict import string _NoneType = type(None) def keeper(keep): table = defaultdict(_NoneType) table.update() return table digit_keeper = keeper(string.digits) 

Здесь сравнение производительности и регулярное выражение:

$ python3.3 -mtimeit -s'import xx3; x="aaa12333bb445bb54b5b52"' 'x.translate(xx3.digit_keeper)' 1000000 loops, best of 3: 1.02 usec per loop $ python3.3 -mtimeit -s'import re; r = re.compile(r"\D"); x="aaa12333bb445bb54b5b52"' 'r.sub("", x)' 100000 loops, best of 3: 3.43 usec per loop 

Итак, для меня это немного больше, чем в 3 раза быстрее, чем регулярное выражение. Он также быстрее, чем class Del выше, потому что defaultdict выполняет все его поиск в C, а не (медленный) Python. Вот эта версия для моей же системы, для сравнения.

$ python3.3 -mtimeit -s'import xx; x="aaa12333bb445bb54b5b52"' 'x.translate(xx.DD)' 100000 loops, best of 3: 13.6 usec per loop 
>>> s 'aaa12333bb445bb54b5b52' >>> a = ''.join(filter(lambda x : x.isdigit(), s)) >>> a '1233344554552' >>> 

Используйте выражение генератора:

>>> s = "foo200bar" >>> new_s = "".join(i for i in s if i in "0123456789") 
$ python -mtimeit -s'import re; x="aaa12333bb445bb54b5b52"' 're.sub(r"\D", "", x)' 

100000 циклов, лучшее из 3: 2,48 мксек на цикл

$ python -mtimeit -s'import re; x="aaa12333bab445bb54b5b52"' '"".join(re.findall("[a-z]+",x))' 

100000 циклов, лучшее из 3: 2,02 пользователя на цикл

$ python -mtimeit -s'import re; x="aaa12333bb445bb54b5b52"' 're.sub(r"\D", "", x)' 

100000 циклов, лучшее из 3: 2,37 циклов на цикл

$ python -mtimeit -s'import re; x="aaa12333bab445bb54b5b52"' '"".join(re.findall("[a-z]+",x))' 

100000 циклов, лучшее из 3: 1,97 циклов за цикл

Я заметил, что соединение быстрее, чем саб.

Читайте также:  Java enterprise applications pdf

Вы можете прочитать каждый символ. Если это цифра, то включите ее в ответ. str.isdigit() метод является способом узнать, является ли символ цифрой.

your_input = '12kjkh2nnk34l34' your_output = ''.join(c for c in your_input if c.isdigit()) print(your_output) # '1223434' 

Не один лайнер, но очень просто:

buffer = "" some_str = "aas30dsa20" for char in some_str: if not char.isdigit(): buffer += char print( buffer ) 

Я использовал это. ‘letters’ должны содержать все буквы, от которых вы хотите избавиться:

Input = «I would like 20 dollars for that suit» Output = Input.translate()) print(Output)

Источник

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

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

  1. Используйте метод isalnum() для удаления всех не буквенно-цифровых символов в строке Python
  2. Используйте функцию filter() для удаления всех не буквенно-цифровых символов в строке Python
  3. Используйте регулярные выражения для удаления всех не буквенно-цифровых символов в строке Python

Буквенно-цифровые символы содержат смесь 26 символов из набора букв и цифр от 0 до 9. Неалфавитно-цифровые символы включают символы, не являющиеся буквами или цифрами, например + и @ .

В этом руководстве мы обсудим, как удалить не буквенно-цифровые символы из строки в Python.

Используйте метод isalnum() для удаления всех не буквенно-цифровых символов в строке Python

Мы можем использовать метод isalnum() , чтобы проверить, является ли данный символ или строка буквенно-цифровыми или нет. Мы можем сравнивать каждый символ в строке по отдельности, и если он буквенно-цифровой, то объединяем его с помощью функции join() .

string_value = "alphanumeric@123__" s = ''.join(ch for ch in string_value if ch.isalnum()) print(s) 

Используйте функцию filter() для удаления всех не буквенно-цифровых символов в строке Python

Функция filter() используется для построения итератора из компонентов итерируемого объекта и фильтрует элементы объекта с помощью функции.

Читайте также:  Java create classes runtime

Для нашей задачи строка является нашим объектом, и мы будем использовать функцию isalnum() , которая проверяет, содержит ли данная строка буквенно-цифровые символы или нет, проверяя каждый символ. Функция join() объединяет все символы для возврата строки.

string_value = "alphanumeric@123__" s = ''.join(filter(str.isalnum, string_value)) print(s) 

Этот метод не работает с Python 3.

Используйте регулярные выражения для удаления всех не буквенно-цифровых символов в строке Python

Регулярное выражение — это исключительная группа символов, которая помогает сопоставлять разные строки или наборы строк с использованием определенного синтаксиса в шаблоне. Чтобы использовать регулярные выражения, мы импортируем модуль re.

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

import re string_value = "alphanumeric@123__" s=re.sub(r'[\W_]+', '', string_value) print(s) 

В качестве альтернативы мы также можем использовать следующий шаблон.

import re string_value = "alphanumeric@123__" s = re.sub(r'[^a-zA-Z0-9]', '', string_value) print(s) 

Сопутствующая статья — Python String

Copyright © 2023. All right reserved

Источник

Оцените статью