2016-04-16 11 views
5

Ho una stringa con frasi sia in arabo che in inglese. Quello che voglio è estrarre solo le Sentenze Arabe.Come recuperare solo i testi arabi da una stringa usando l'espressione regolare?

my_string=""" 
What is the reason 
ذَلِكَ الْكِتَابُ لَا رَيْبَ فِيهِ هُدًى لِلْمُتَّقِينَ 
behind this? 
ذَلِكَ الْكِتَابُ لَا رَيْبَ فِيهِ هُدًى لِلْمُتَّقِينَ 
""" 

This Link mostra che il campo Unicode per le lettere arabe è 0600-06FF.

Quindi, tentativo molto di base è venuta in mente è:

import re 
print re.findall(r'[\u0600-\u06FF]+',my_string) 

Ma, questo fallisce miseramente in quanto restituisce il seguente elenco.

['What', 'is', 'the', 'reason', 'behind', 'this?'] 

Come potete vedere, questo è esattamente opposto di quello che voglio. Cosa mi manca qui?

N.B.

so di poter abbinare le lettere arabe utilizzando corrispondenza inversa come di seguito:

print re.findall(r'[^a-zA-Z\s0-9]+',my_string) 

Ma, io non voglio questo.

risposta

4

È possibile utilizzare re.sub per sostituire i caratteri ascii con una stringa vuota.

>>> my_string=""" 
... What is the reason 
... ذَلِكَ الْكِتَابُ لَا رَيْبَ فِيهِ هُدًى لِلْمُتَّقِينَ 
... behind this? 
... ذَلِكَ الْكِتَابُ لَا رَيْبَ فِيهِ هُدًى لِلْمُتَّقِينَ 
... """ 
>>> print(re.sub(r'[a-zA-Z?]', '', my_string).strip()) 
ذَلِكَ الْكِتَابُ لَا رَيْبَ فِيهِ هُدًى لِلْمُتَّقِينَ 

ذَلِكَ الْكِتَابُ لَا رَيْبَ فِيهِ هُدًى لِلْمُتَّقِينَ 

tua espressione regolare non ha funzionato perché si sta utilizzando Python 2 e la stringa è str è necessario convertire my_string per Unicode per farlo funzionare. Tuttavia lo ha fatto perfettamente lavorare su Python3.x

>>> print "".join(re.findall(ur'[\u0600-\u06FF]', unicode(my_string, "utf-8"), re.UNICODE)) 
ذَلِكَالْكِتَابُلَارَيْبَفِيهِهُدًىلِلْمُتَّقِينَذَلِكَالْكِتَابُلَارَيْبَفِيهِهُدًىلِلْمُتَّقِينَ 
+0

Grazie per la tua bella risposta, +1 Ma perché il tentativo di cui sopra non funziona? –

+0

Sono soddisfatto :) Grazie –

2

tuo codice originale era corretta, solo bisogno di codificare my_string con la codifica corretta, 'utf-8' e aggiungere u nel vostro re modello dal momento che si sta lavorando con python2,

>>> for x in re.findall(ur'[\u0600-\u06FF]+', my_string.decode('utf-8')): 
     print x 


ذَلِكَ 
الْكِتَابُ 
لَا 
رَيْبَ 
فِيهِ 
هُدًى 
لِلْمُتَّقِينَ 
ذَلِكَ 
الْكِتَابُ 
لَا 
رَيْبَ 
فِيهِ 
هُدًى 
لِلْمُتَّقِينَ 

Questo vi darà una lista di stringhe Unicode corrispondenti al posto dei singoli caratteri che non ti servono ad unirsi a loro indietro con ''.join

Se foste in python3, non è necessario n eed qualsiasi codifica tweeking come codifica predefinita è 'utf-8':

>>> for x in re.findall(r'[\u0600-\u06FF]+', my_string): 
     print(x) 


ذَلِكَ 
الْكِتَابُ 
لَا 
رَيْبَ 
فِيهِ 
هُدًى 
لِلْمُتَّقِينَ 
ذَلِكَ 
الْكِتَابُ 
لَا 
رَيْبَ 
فِيهِ 
هُدًى 
لِلْمُتَّقِينَ 
2

Il codice è:

print re.findall(r'[\u0600-\u06FF]+',my_string) 

Nello specificare una sequenza di byte, non esiste tale concetto come punti di codice Unicode. Pertanto, le sequenze di escape \u nell'espressione regolare non hanno alcun senso. Non sono interpretati come pensavi, ma significano solo u.

Così quando analizza l'espressione regolare per byte, è equivalente a:

print re.findall(r'[u0600-u06FF]+',my_string) 

Questa classe carattere viene interpretato come “uno dei u060, o un byte nell'intervallo 0-u, o uno dei 06FF”. Questo, a sua volta, equivale a [0-u], poiché tutti gli altri byte sono già inclusi in questo intervallo.

print re.findall(r'[0-u]+', my_string) 

Dimostrazione:

my_string = "What is thizz?" 
print re.findall(r'[\u0600-\u06FF]+',my_string) 
['What', 'is', 'thi', '?'] 

Si noti che il zz non corrisponde, in quanto si tratta dietro u nel set di caratteri ASCII.

+0

Questa è la migliore spiegazione della situazione. Vorrei poter fare +2. Grazie amico :) –

+1

non dovrebbe leggere: "uno di ** u060 **, o un byte nell'intervallo * 0-u *, o uno di * 06FF *" – sweaver2112

+0

Grazie mille per la vostra attenta lettura. L'ho risolto –

Problemi correlati