J'écris un python MapReduce programme de comptage de mots. Le problème est qu'il y a beaucoup de caractères non alphabétiques éparpillés dans les données, j'ai trouvé ce message en supprimant tout sauf les caractères alphanumériques de une chaîne en Python qui montre une solution intéressante utilisant regex, mais je ne sais pas comment l'implémenter
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
J'ai bien peur de ne pas savoir comment utiliser la bibliothèque re
ou même regex d'ailleurs. Je ne suis pas sûr de savoir comment appliquer le motif regex à la chaîne entrante (ligne d'un livre) v
correctement pour récupérer la nouvelle ligne sans caractère non alphanumérique.
Suggestions?
Utilisation 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'
Alternativement, si vous souhaitez uniquement supprimer un certain ensemble de caractères (une apostrophe pourrait convenir à votre saisie ...)
regex = re.compile('[,\.!?]') #etc.
Si vous préférez ne pas utiliser regex, vous pouvez essayer
''.join([i for i in s if i.isalpha()])
Vous pouvez utiliser la fonction re.sub () pour supprimer ces caractères:
>>> import re
>>> re.sub("[^a-zA-Z]+", "", "ABC12abc345def")
'ABCabcdef'
re.sub (motif de correspondance, remplacement de chaîne, chaîne de recherche)
"[^a-zA-Z]+"
- recherche tout groupe de caractères qui ne sont PAS a-zA-z.""
_ - Remplace les caractères correspondants par ""Essayer:
s = filter(str.isalnum, s)
La méthode la plus rapide est 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 = 'abcdefghijklmnopqrstuvwxyz123456789!@#$%^&*()-=_+'
""", number = 1000000)
print(t0)
#Try with join method on filter
t0 = timeit.timeit("""
s = ''.join(filter(str.isalnum, st))
""", setup = """
st = 'abcdefghijklmnopqrstuvwxyz123456789!@#$%^&*()-=_+'
""",
number = 1000000)
print(t0)
#Try with only join
t0 = timeit.timeit("""
s = ''.join(c for c in st if c.isalnum())
""", setup = """
st = 'abcdefghijklmnopqrstuvwxyz123456789!@#$%^&*()-=_+'
""", number = 1000000)
print(t0)
2.6002226710006653 Method 1 Regex
5.739747313000407 Method 2 Filter + Join
6.540099570000166 Method 3 Join