web-dev-qa-db-de.com

Python, entfernen Sie alle Zeichen, die keine Buchstaben sind, aus der Zeichenfolge

Ich schreibe ein python MapReduce Word Count-Programm. Das Problem ist, dass in den Daten viele nicht-alphabetische Zeichen verstreut sind. Ich habe diesen Beitrag gefunden Stripping Alles andere als alphanumerische Zeichen aus einem String in Python , der eine nette Lösung mit Regex zeigt, aber ich bin nicht sicher, wie ich es implementieren soll

def mapfn(k, v):
    print v
    import re, string 
    pattern = re.compile('[\W_]+')
    v = pattern.match(v)
    print v
    for w in v.split():
        yield w, 1

Ich fürchte, ich bin mir nicht sicher, wie ich die Bibliothek re oder sogar Regex verwenden soll. Ich bin nicht sicher, wie ich das Regex-Muster auf die eingehende Zeichenfolge (Zeile eines Buches) v richtig anwenden soll, um die neue Zeile ohne nicht-alphanumerische Zeichen abzurufen.

Vorschläge?

61
KDecker

Verwenden re.sub

import re

regex = re.compile('[^a-zA-Z]')
#First parameter is the replacement, second parameter is your input string
regex.sub('', 'ab3d*E')
#Out: 'abdE'

Alternativ, wenn Sie nur einen bestimmten Zeichensatz entfernen möchten (ein Apostroph könnte in Ihrer Eingabe in Ordnung sein ...)

regex = re.compile('[,\.!?]') #etc.
86
limasxgoesto0

Wenn Sie es vorziehen, Regex nicht zu verwenden, können Sie es versuchen

''.join([i for i in s if i.isalpha()])
34
Tad

Mit der Funktion re () können Sie folgende Zeichen entfernen:

>>> import re
>>> re.sub("[^a-zA-Z]+", "", "ABC12abc345def")
'ABCabcdef'

re (MATCH PATTERN, REPLACE STRING, STRING TO SEARCH)

  • "[^a-zA-Z]+" - Suche nach einer Gruppe von Zeichen, die NICHT a-zA-z sind.
  • "" - Ersetzen Sie die übereinstimmenden Zeichen durch "".
23
Kevin

Versuchen:

s = filter(str.isalnum, s)
15
Dona

Die schnellste Methode ist Regex

#Try with regex first
t0 = timeit.timeit("""
s = r2.sub('', st)

""", setup = """
import re
r2 = re.compile(r'[^a-zA-Z0-9]', re.MULTILINE)
st = '[email protected]#$%^&*()-=_+'
""", number = 1000000)
print(t0)

#Try with join method on filter
t0 = timeit.timeit("""
s = ''.join(filter(str.isalnum, st))

""", setup = """
st = '[email protected]#$%^&*()-=_+'
""",
number = 1000000)
print(t0)

#Try with only join
t0 = timeit.timeit("""
s = ''.join(c for c in st if c.isalnum())

""", setup = """
st = '[email protected]#$%^&*()-=_+'
""", number = 1000000)
print(t0)


2.6002226710006653 Method 1 Regex
5.739747313000407 Method 2 Filter + Join
6.540099570000166 Method 3 Join
2
PirateApp