Python supprimer tout ce qui n'est pas une lettre ou un chiffre

j'ai un petit problème avec les expressions régulières de Python.

Quelle est la bonne façon de supprimer tous les caractères d'une chaîne qui ne sont pas des lettres ou des nombres?

Merci!

17
demandé sur Chris Dutrow 2011-06-12 21:09:48

7 réponses

[\w] corresponds (alphanumérique ou souligné).

[\W] correspond à (pas (alphanumériques ou tiret)), ce qui est équivalent à (non alphanumériques et pas de trait de soulignement)

Vous avez besoin d' [\W_] supprimer tous les caractères non alphanumériques.

lors de l'utilisation de re.sub(), il sera beaucoup plus efficace si vous réduisez le nombre de substitutions (cher) par correspondance à l'aide de [\W_]+ au lieu de le faire une à une.

maintenant tout ce que vous avez besoin est de définir caractères alphanumériques:

str object, only ASCII A-Za-z0-9:

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

str objet, seuls les paramètres régionaux définis par des caractères alphanumériques:

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

unicode objet, tous les caractères alphanumériques:

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

Exemples str objet:

>>> 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 exemple:

>>> re.sub(ur'[\W_]+', u'', u'a_b A_Z \x80\xFF \u0404', flags=re.UNICODE)
u'abAZ\xff\u0404'
22
répondu John Machin 2011-06-13 01:10:41

'\W' est le même que [^A-Za-z0-9_] plus les caractères accentués de votre localité.

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

peut-être que vous voulez garder les espaces ou avoir tous les mots (et les nombres):

>>> re.findall('\w+', 'my. text, --without-- (punctuation) 123')
['my', 'text', 'without', 'punctuation', '123']
7
répondu JBernardo 2011-06-12 19:07:38

dans la règle de correspondance du jeu de caractères [...] vous pouvez spécifier

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'
4
répondu 6502 2011-06-12 17:19:49

Vous pouvez aussi essayer d'utiliser les méthodes isalpha et isnumeric de la façon suivante:

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(' '))
3
répondu Artsiom Rudzenka 2011-06-12 18:30:28

il y a d'autres moyens aussi que vous pouvez considérer par exemple simplement boucle à travers la chaîne de caractères et sauter les caractères indésirables par exemple en supposant que vous voulez supprimer tous les caractères ascii qui ne sont pas des lettres ou des chiffres

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

ou utilisez string.traduire à la carte d'un char à l'autre ou d'en supprimer certains caractères par exemple,

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

de cette façon, vous devez calculer todelete liste une fois ou todelete peut être codé en dur une fois et l'utiliser partout où vous avez besoin de convertir la chaîne

3
répondu Anurag Uniyal 2011-06-13 13:53:45

vous pouvez utiliser regex prédéfini en python:\W correspond à l'ensemble [^a-zA-Z0-9_]. Alors,

import re
s = 'Hello dutrow 123'
re.sub('\W', '', s)
--> 'Hellodutrow123'
1
répondu Gabriel 2011-06-12 17:35:39

Vous avez besoin pour être plus précis:

  1. Qu'en est-il des "lettres"Unicode? c'est à dire ceux avec diacriticals.
  2. Qu'un espace blanc? (Je suppose que c'est ce que vous voulez supprimer avec la ponctuation)
  3. Quand vous dites "lettres" voulez-vous dire A-Z et a-z en ASCII seulement?
  4. Quand tu dis "numéros" voulez-vous dire 0-9 une seule? Qu'en décimales, des séparateurs et des exposants?

cela devient complexe rapidement...

Un excellent endroit pour commencer est un outil interactif regex site, tels que RegExr

vous pouvez aussi obtenir spécifique à Python Python Regex Tool

1
répondu the wolf 2011-06-12 18:32:15