Muszę usunąć wszystkie znaki ze sznurka, z wyjątkiem numerów i symboli specjalnych. Przykład "asdasd 289(222):310" powinien spowodować "289(222):310". Jak mam to zrobic ?

-1
user3845621 12 sierpień 2014, 19:18

3 odpowiedzi

Najlepsza odpowiedź

Możesz usunąć litery,

>>> import re
>>> s = "asdasd 289(222):310"
>>> m = re.sub(r'[A-Za-z]+', r'', s)
>>> m
' 289(222):310'

Jeśli chcesz usunąć spacje, spróbuj poniższy kod,

>>> m = re.sub(r'[A-Za-z ]+', r'', s)
>>> m
'289(222):310'
2
Avinash Raj 12 sierpień 2014, 15:21

Możesz sprawdzić każdą postać, aby sprawdzić, czy jest to znak alfabetyczny.

>>> s = "asdasd 289(222):310"
>>> "".join(i for i in s if not i.isalpha())
' 289(222):310'

Jeśli chcesz usunąć wiodące i kończące białe znaki, hals na .strip()

>>> "".join(i for i in s if not i.isalpha()).strip()
'289(222):310'

Klasa string ma metody isalpha() i isdigit(), które są przydatne dla takich rzeczy.

>>> '2'.isdigit()
True
>>> '2'.isalpha()
False
>>> 'a'.isdigit()
False
>>> 'a'.isalpha()
True
0
Cory Kramer 12 sierpień 2014, 15:19

Jeśli z jakiegokolwiek powodu prędkość jest z istoty, następujący kod może pomóc:

from string import maketrans
trans1 = maketrans("abcdefghijklmnopqrstuvwxyzABCDEFGHOJKLMNOPQRSTUVWXYZ", " "*52)
s = "asdasd 289(222):310"
m = s.translate(trans1).replace(" ", "")

Termasy z Ipython's% Timeit Pokaż mi 1.2 UTEC do tego podejścia, 3,3 USEC dla REGEX Wysłany przez Avinash Raj i 8SEC dla metody Cyber (w systemie Windows 8.1 64 bit Python 2.7.8 64).

Używanie .strip zamiast .replace jest szybsze (~ 900 NS), ale nie zastąpi między spacjami.

Oczywiście czasy zależą od rodzaju danych, które zostaną przetworzone.

0
bconstanzo 12 sierpień 2014, 15:45