38 Stimmen

Python entfernt alles, was nicht ein Buchstabe oder eine Zahl ist

Ich habe ein paar Probleme mit regulären Ausdrücken in Python.

Wie lassen sich alle Zeichen in einer Zeichenkette entfernen, die keine Buchstaben oder Zahlen sind?

Danke!

42voto

John Machin Punkte 78125

[\w] Übereinstimmungen (alphanumerisch oder Unterstrich).

[\W] entspricht (nicht (alphanumerisch oder Unterstrich)), was gleichbedeutend ist mit (nicht alphanumerisch und nicht Unterstrich)

Sie benötigen [\W_] um ALLE nicht alphanumerischen Zeichen zu entfernen.

Bei der Verwendung von re.sub() ist es sehr viel effizienter, wenn Sie die Anzahl der (teuren) Ersetzungen reduzieren, indem Sie [\W_]+ anstatt sie nacheinander zu erledigen.

Jetzt müssen Sie nur noch alphanumerische Zeichen definieren:

str Objekt, nur ASCII A-Za-z0-9:

    re.sub(r'[\W_]+', '', s)

str Objekt, nur lokal definierte alphanumerische Zeichen:

    re.sub(r'[\W_]+', '', s, flags=re.LOCALE)

unicode Objekt, alle alphanumerischen Zeichen:

    re.sub(ur'[\W_]+', u'', s, flags=re.UNICODE)

Beispiele für str Objekt:

>>> import re, locale
>>> sall = ''.join(chr(i) for i in xrange(256))
>>> len(sall)
256
>>> re.sub('[\W_]+', '', sall)
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
>>> re.sub('[\W_]+', '', sall, flags=re.LOCALE)
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
>>> locale.setlocale(locale.LC_ALL, '')
'English_Australia.1252'
>>> re.sub('[\W_]+', '', sall, flags=re.LOCALE)
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\x83\x8a\x8c\x8e\
x9a\x9c\x9e\x9f\xaa\xb2\xb3\xb5\xb9\xba\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\
xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd8\xd9\xda\xdb\xdc\xdd\xde\
xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\
xf3\xf4\xf5\xf6\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff'
# above output wrapped at column 80

Unicode-Beispiel:

>>> re.sub(ur'[\W_]+', u'', u'a_b A_Z \x80\xFF \u0404', flags=re.UNICODE)
u'abAZ\xff\u0404'

10voto

6502 Punkte 108136

In der Übereinstimmungsregel für die Zeichenmenge [...] können Sie angeben ^ als erstes Zeichen, um "nicht in" zu bedeuten

import re
re.sub("[^0-9a-zA-Z]",        # Anything except 0..9, a..z and A..Z
       "",                    # replaced with nothing
       "this is a test!!")    # in this string

--> 'thisisatest'

9voto

JBernardo Punkte 30924

'\W' ist dasselbe wie [^A-Za-z0-9_] plus Zeichen mit Akzent aus Ihrem Land.

>>> re.sub('\W', '', 'text 1, 2, 3...')
'text123'

Vielleicht möchten Sie die Leerzeichen beibehalten oder alle Wörter (und Zahlen) haben:

>>> re.findall('\w+', 'my. text, --without-- (punctuation) 123')
['my', 'text', 'without', 'punctuation', '123']

4voto

Artsiom Rudzenka Punkte 26969

Sie können auch versuchen, die Methoden isalpha und isnumeric auf folgende Weise zu verwenden:

text = 'base, sample test;'
getVals = lambda x: (c for c in text if c.isalpha() or c.isnumeric())
map(lambda word: ' '.join(getVals(word)): text.split(' '))

3voto

Anurag Uniyal Punkte 81337

Es gibt auch andere Möglichkeiten, die Sie in Betracht ziehen können, z. B. einfach eine Schleife durch den String zu ziehen und unerwünschte Zeichen zu überspringen, z. B. wenn Sie alle ASCII-Zeichen löschen möchten, die keine Buchstaben oder Ziffern sind.

>>> newstring = [c for c in "a!1#b$2c%3\t\nx" if c in string.letters + string.digits]
>>> "".join(newstring)
'a1b2c3x'

oder verwenden Sie string.translate, um ein Zeichen in ein anderes umzuwandeln oder einige Zeichen zu löschen, z. B.

>>> todelete = [ chr(i) for i in range(256) if chr(i) not in string.letters + string.digits ]
>>> todelete = "".join(todelete)
>>> "a!1#b$2c%3\t\nx".translate(None, todelete)
'a1b2c3x'

Auf diese Weise müssen Sie Folgendes berechnen todelete Liste einmalig oder todelete kann einmal fest kodiert werden und überall dort verwendet werden, wo eine Zeichenkette umgewandelt werden soll

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X