web-dev-qa-db-fra.com

Python, supprime tous les caractères non alphabétiques de la chaîne

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?

61
KDecker

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.
86
limasxgoesto0

Si vous préférez ne pas utiliser regex, vous pouvez essayer

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

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 ""
23
Kevin

Essayer:

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

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
2
PirateApp