2016-04-16 3 views
5

मेरे पास एक स्ट्रिंग है जिसमें अरबी और अंग्रेजी दोनों वाक्यों हैं। मैं चाहता हूं कि केवल अरबी वाक्य निकालें।नियमित अभिव्यक्ति का उपयोग करके स्ट्रिंग से केवल अरबी ग्रंथों को कैसे पुनर्प्राप्त करें?

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

This Link पता चलता है कि अरबी अक्षरों के लिए यूनिकोड श्रेणी 0600-06FF है।

तो, बहुत ही बुनियादी प्रयास मेरे मन में आए है:

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

लेकिन, इस बुरी तरह विफल रहता है के रूप में यह निम्न सूची देता है।

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

जैसा कि आप देख सकते हैं, यह वही है जो मैं चाहता हूं। मैं यहाँ क्या याद कर रहा हूँ?

एनबी।

मैं जानता हूँ कि मैं नीचे की तरह उलटा मिलान का उपयोग करके अरबी अक्षरों से मेल कर सकते हैं:

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

लेकिन, मुझे लगता है कि नहीं करना चाहती।

उत्तर

4

आप खाली स्ट्रिंग वाले एएससीआई अक्षरों को प्रतिस्थापित करने के लिए re.sub का उपयोग कर सकते हैं।

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

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

आपका regex क्योंकि आप अजगर 2 का उपयोग कर रहे हैं और अपने स्ट्रिंग str है आप इसे काम करने के लिए यूनिकोड को my_string बदलने की आवश्यकता काम नहीं किया। हालांकि यह पूरी तरह Python3.x

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

आपके अच्छे उत्तर के लिए धन्यवाद, +1 लेकिन उपरोक्त प्रयास क्यों काम नहीं करते? –

+0

मैं संतुष्ट हूं :) धन्यवाद –

2

आपका मूल कोड सही था पर काम किया था, बस उचित इनकोडिंग के साथ, 'utf-8' my_string सांकेतिक शब्दों में बदलना और जब से तुम को Python2 साथ काम कर रहे अपने re पैटर्न में u जोड़ने के लिए की जरूरत है,

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


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

यह आपको एक अक्षर हैं जो आप ''.join

साथ उन्हें वापस शामिल होने के लिए यदि आप python3 में थे की जरूरत नहीं है के बजाय मिलान किया यूनिकोड स्ट्रिंग की एक सूची दे देंगे, आप n नहीं है eed एन्कोडिंग डिफ़ॉल्ट एन्कोडिंग के रूप में tweeking के किसी भी 'utf-8' है:

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


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

आपका कोड है:

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

जब एक बाइट क्रम मिलान, वहाँ यूनिकोड कोड अंक जैसी कोई अवधारणा है। इसलिए, \u नियमित अभिव्यक्ति में भागने के अनुक्रमों का कोई अर्थ नहीं है। जैसा कि आपने सोचा था, उनका अर्थ नहीं है, लेकिन इसका मतलब है u

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

यह चरित्र वर्ग "u060 में से एक, या सीमा 0-u में एक बाइट, या 06FF में से एक" के रूप में व्याख्या की है:

तो जब बाइट्स के लिए नियमित अभिव्यक्ति को पार्स, यह करने के लिए बराबर है। यह बदले में, [0-u] के बराबर है, क्योंकि अन्य सभी बाइट्स पहले ही इस श्रेणी में शामिल हैं।

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

प्रदर्शन:

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

ध्यान दें कि zz दर्ज नहीं होता है, क्योंकि यह ASCII वर्ण सेट में u पीछे आता है।

+0

यह स्थिति का सबसे अच्छा स्पष्टीकरण है। काश मैं +2 कर सकता था। धन्यवाद दोस्त :) –

+1

इसे पढ़ना नहीं चाहिए: "** u060 ** में से एक, या श्रेणी में बाइट * 0-u *, या * 06FF *" – sweaver2112

+0

में से एक आपके सावधानीपूर्वक पढ़ने के लिए बहुत बहुत धन्यवाद। मैंने इसे ठीक कर दिया है। –

संबंधित मुद्दे