2011-08-26 17 views
13

Come posso abbinare una lettera da qualsiasi lingua usando una regex in python 3?Lettera di corrispondenza in qualsiasi lingua

re.match([a-zA-Z]) corrisponderà ai caratteri della lingua inglese ma voglio che tutte le lingue siano supportate simultaneamente.

Non desidero abbinare lo ' a can't o caratteri di sottolineatura o qualsiasi altro tipo di formattazione. Vorrei che il mio regex corrispondesse: c, a, n, t, Å, é e .

+0

Non riesco a pensare a un modo logico per andare su questo. La maggior parte delle lingue non corrisponde all'alfabeto inglese. Ad esempio, se provassi ad abbinare una "k" in giapponese, non saresti in grado di farlo. La loro lingua contiene solo 'ka' 'ki' 'ku' 'ke' 'ko' ma sono rappresentati da simboli in modo che un K non possa corrispondere a nessun carattere specifico. Affinché ciò funzioni, devi essenzialmente prendere una lingua e "tradurla" in un equivalente inglese. Quindi se hai incontrato "buongiorno" in giapponese は ん に ち は dovresti "tradurlo" in "konnichiwa" prima di fare una regex match. – Tony318

+3

@ Tony318 Mi capita di essere laureato in giapponese ... Questo approccio è sbagliato su così tanti livelli ... – ty812

+3

possibile duplicato di http://stackoverflow.com/questions/2039140/python-re-how-do-i- match-an-alpha-character – Marty

risposta

16

per Unicode lavoro regex in Python, raccomando fortemente il seguente:

  1. Uso Matthew Barnett’s regex library invece di standard di re, che non è proprio adatto per Unicode regolare espressioni.
  2. Utilizzare solo Python 3, mai Python 2. Si desidera che tutte le stringhe siano stringhe Unicode.
  3. Utilizzare solo valori letterali stringa con codepoint Unicode logici/astratti, stringhe di byte non codificate.
  4. Imposta la codifica sui tuoi stream e non pensarci più. Se ti trovi sempre a chiamare manualmente .encode e così, stai quasi certamente facendo qualcosa di sbagliato.
  5. Utilizzare solo una build di grandi dimensioni in cui punti di codice e unità di codice sono uguali, mai e poi mai stretti - cosa che si potrebbe considerare deprecabile per robustezza Unicode.
  6. Normalizza tutte le stringhe in ingresso su NFD in entrata e quindi NFC in uscita. Altrimenti non puoi ottenere un comportamento affidabile.

Una volta fatto questo, si può tranquillamente scrivere modelli che includono \w o \p{script=Latin} o \p{alpha} e \p{lower} ecc e sapere che questi saranno tutti fare quello che the Unicode Standard says they should. Spiego tutto questo business di Python Unicode regex business in modo molto più dettagliato in this answer. Il racconto è di utilizzare sempre regex non re.

Per un consiglio generale su Unicode, ho anche several talks from last OSCON sulle espressioni regolari Unicode, molte delle quali, a parte il terzo talk, non riguardano Python, ma molte delle quali sono adattabili.

Infine, c'è sempre this answer per mettere nel tuo cuore la paura di Dio (o almeno, di Unicode).

1

Costruire una classe di corrispondenza di tutti i caratteri che si desidera abbinare. Questo potrebbe diventare molto, molto grande. No, non esiste una scorciatoia RegEx per "All Kanji";)

Forse è più facile abbinare per quello che non vuoi, ma anche in quel caso, questa classe diventerebbe estremamente grande.

+0

Non mi ero reso conto che sarebbe stato così complicato ... Inizierò creando un istogramma dei personaggi in tutto il testo Desidero elaborare ... – Baz

+0

Dipende dal motore regex. Puoi abbinare la proprietà dello script in alcuni motori, come Perl's, dove puoi semplicemente selezionare lo script Han (questi sono caratteri * Han *, anche se sono usati anche dai giapponesi e li chiamano Kanji). – Joey

+0

Certo, puoi farlo per * uno * script una volta - ma non per * ogni * uno allo stesso tempo (Non parliamo delle problematiche Han/Kanji qui ... questa è una lunga, sanguinosa storia, no, molte i caratteri non sono esattamente uguali) – ty812

4

È possibile abbinare il

\p{L} 

che corrisponde a qualsiasi punto di codice Unicode che rappresenta una lettera di uno script. Cioè, supponendo che tu abbia un motore regex con capacità Unicode, che spero davvero che Python abbia.

+0

opere su Ruby anche :) – Aleksey

7

Cosa c'è di sbagliato nell'usare la sequenza speciale \ w?

# -*- coding: utf-8 -*- 
import re 
test = u"can't, Å, é, and 中ABC" 
print re.findall('\w+', test, re.UNICODE) 
+1

'\ W' corrisponde anche cifre' [0-9] 'e' _' sottolineare – Toto

+1

molto buona, che è la risposta giusta sotto la libreria standard di Python (anche se io uso sempre Unicode letterali me stesso). Nota che in [UTS # 18] (http://unicode.org/reports/tr18/#Categories), un "word" char à la '\ w' copre 102.724 punti di codice in Unicode 6.0 ed è qualsiasi GC = L (100,520), GC = M (1,492), GC = Nd (420), GC = Nl (224) o GC = Pc (10) punto di codice. Python's 're' è un po 'datato, quindi non ha tenuto il passo con lo standard, ma è vicino-ish. Puoi usare "regex" di Matthew Barnett invece se vuoi uguagliare esattamente lo standard Unicode; fornisce anche '\ p {alpha}', che è quello che vuoi qui. – tchrist

+0

@ M42: È piuttosto più complicato di così, ma sì. normale 'biblioteca re' di Python è [non va bene per Unicode] (http://stackoverflow.com/questions/7063420/perl-compatible-regular-expression-pcre-in-python/7066413#7066413), anche se è vicino alla [ RL1.2a] (http://unicode.org/reports/tr18/#Compatibility_Properties), ma manca di proprietà di base per [RL1.2] (http://unicode.org/reports/tr18/#Categories) e le proprietà complete al [RL2.7] (http://www.unicode.org/reports/tr18/tr18-14.html#Full_Properties). Per quasi tutte le espressioni regolari di Unicode in Python si dovrebbe usare invece la libreria 'regex' di Matthew Barnett. – tchrist

1
 
import re 

text = "can't, Å, é, and 中ABC" 
print(re.findall('\w+', text)) 

Questo funziona in Python 3. Ma corrisponde anche ai caratteri di sottolineatura. Tuttavia questo sembra fare il lavoro come vorrei:

 
import regex 

text = "can't, Å, é, and 中ABC _ sh_t" 
print(regex.findall('\p{alpha}+', text)) 
0

Per la lingua portoghese, utilizzare provate questo:

[a-zA-ZÀ-ú ]+ 
Problemi correlati