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!
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'
'\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']
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'
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(' '))
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
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'
Vous avez besoin pour être plus précis:
- Qu'en est-il des "lettres"Unicode? c'est à dire ceux avec diacriticals.
- Qu'un espace blanc? (Je suppose que c'est ce que vous voulez supprimer avec la ponctuation)
- Quand vous dites "lettres" voulez-vous dire
A-Z
eta-z
en ASCII seulement? - 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