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?
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.
Wenn Sie es vorziehen, Regex nicht zu verwenden, können Sie es versuchen
''.join([i for i in s if i.isalpha()])
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 "".Versuchen:
s = filter(str.isalnum, s)
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