2013-09-06 20 views
8

Attualmente uso re.findall per trovare e isolare le parole dopo il carattere '#' per i tag hash in una stringa:Come spiegare i caratteri accentati per regex in Python?

hashtags = re.findall(r'#([A-Za-z0-9_]+)', str1) 

E ricerche str1 e trova tutti gli hashtag. Questo funziona, tuttavia, non tiene conto di caratteri accentati come questi, ad esempio: áéíóúñü¿.

Se una di queste lettere è in str1, salverà l'hashtag fino alla lettera precedente. Ad esempio, #yogenfrüz sarebbe #yogenfr.

ho bisogno di essere in grado di tenere conto di tutte le lettere accentate che spaziano dal tedesco, olandese, francese e spagnolo in modo da poter salvare hashtag come #yogenfrüz

Come posso fare per fare questo

+2

Usa re.UNICODE' opzione '. –

+0

@AshwiniChaudhary: il flag UNICODE non renderà l'intervallo utilizzato corrispondente ai caratteri non ASCII, no. Se si dice che un'espressione regolare corrisponde a "a-z", prende l'intervallo letterale, non l'interpretazione umana che 'a' e' á' in qualche modo sono la stessa cosa. –

+0

@MartijnPieters: quindi, cosa lo farà? ;-) – JohnTortugo

risposta

21

provare il seguente:

hashtags = re.findall(r'#(\w+)', str1, re.UNICODE) 

Regex101 Demo

EDIT Controlla il commento utile qui sotto di Martijn Pieters.

+4

Piccolo avvertimento: '\ w' non corrisponderà ai codepoint combinati, quindi' a' e [U + 0301 COMBINING ACUTE ACCENT] (https://codepoints.net/U +0301) non verranno confrontati, anche se * stampa * come 'á'. Potresti voler normalizzare a NFC, per prima cosa. –

+0

@MartijnPieters Grazie per la condivisione, sempre qualcosa in più da imparare. –

+0

@IbrahimNajjar puoi implementare la soluzione menzionata da Martijn Pieters sulla tua soluzione? Grazie. –

2

Si consiglia inoltre di utilizzare

import unicodedata 
output = unicodedata.normalize('NFD', my_unicode).encode('ascii', 'ignore') 

Come faccio a convertire tutti quei caratteri di escape nei loro rispettivi personaggi come se non v'è un a Unicode, come faccio a convertire in uno standard di un? Si supponga di aver caricato il tuo unicode in una variabile denominata my_unicode ... normalizzando à in una è questa semplice ...

importazione unicodedata uscita = unicodedata.normalize ('NFD', my_unicode) .encode ('ascii' , 'ignora') esempio esplicita ...

myfoo = u'àà' 
myfoo 
u'\xe0\xe0' 
unicodedata.normalize('NFD', myfoo).encode('ascii', 'ignore') 
'aa' 

controllo questa risposta mi ha aiutato molto: How to convert unicode accented characters to pure ascii without accents?

+0

ottima risposta berk! qualcuno lo troverà sicuramente utile! – noahandthewhale