2011-08-26 12 views
13

पायथन 3 में रेगेक्स का उपयोग करके मैं किसी भी भाषा से किसी पत्र से कैसे मेल कर सकता हूं?किसी भी भाषा में मिलान पत्र

re.match([a-zA-Z]) अंग्रेजी भाषा के पात्रों से मेल खाता है लेकिन मैं सभी भाषाओं को एक साथ समर्थित करना चाहता हूं।

मैं can't या अंडरस्कोर या किसी अन्य प्रकार के स्वरूपण में ' से मेल नहीं करना चाहता हूं। मैं चाहता हूं कि मेरा रेगेक्स मिलान करे: c, a, n, t, Å, é, और

+0

मैं इस बारे में जाने के लिए एक तार्किक ढंग से नहीं सोच सकते हैं। अधिकांश भाषाएं अंग्रेजी वर्णमाला से मेल नहीं खाती हैं। उदाहरण के लिए, यदि आपने जापानी में 'के' से मिलान करने का प्रयास किया है तो आप इसे करने में सक्षम नहीं होंगे। उनकी भाषा में केवल 'का' 'की' 'कू' 'के' 'को' होता है लेकिन उन्हें प्रतीकों द्वारा दर्शाया जाता है ताकि एक के किसी भी विशिष्ट चरित्र से मेल नहीं खा सके। इसके लिए काम करने के लिए, आपको अनिवार्य रूप से एक भाषा लेने और अंग्रेजी अनुवाद के रूप में "अनुवाद" करने की आवश्यकता होगी। तो यदि आपको जापानी में "सुप्रभात" का सामना करना पड़ा तो आपको रेगेक्स मैच करने से पहले "कोननिचवा" में "अनुवाद" करना होगा। – Tony318

+3

@ टोनी 318 मैं जापानी में महारत हासिल कर रहा हूं ... यह दृष्टिकोण इतने सारे स्तरों पर गलत है ... – ty812

+3

http://stackoverflow.com/questions/2039140/python-re-how-do-i- के संभावित डुप्लिकेट मैच-ए-अल्फा-कैरेक्टर – Marty

उत्तर

16

पायथन में यूनिकोड regex काम के लिए, मैं बहुत दृढ़ता से निम्नलिखित की सिफारिश:

  1. उपयोग Matthew Barnett’s regex library मानक re के बजाय, जो यूनिकोड नियमित के लिए वास्तव में उपयुक्त नहीं है भाव।
  2. केवल पायथन 3 का उपयोग करें, कभी पायथन 2 नहीं। आप अपने सभी तार यूनिकोड तारों के लिए चाहते हैं।
  3. लॉजिकल/अमूर्त यूनिकोड कोडपॉइंट्स के साथ स्ट्रिंग अक्षर का उपयोग करें, बाइट स्ट्रिंग एन्कोड नहीं किया गया है।
  4. अपनी स्ट्रीमिंग पर अपनी एन्कोडिंग सेट करें और इसके बारे में भूल जाओ। यदि आप स्वयं को मैन्युअल रूप से .encode पर कॉल करते हैं और ऐसा लगता है, तो आप लगभग निश्चित रूप से कुछ गलत कर रहे हैं।
  5. केवल एक विस्तृत निर्माण का उपयोग करें जहां कोड पॉइंट्स और कोड इकाइयां समान हों, कभी भी एक संकीर्ण नहीं - जिसे आप यूनिकोड मजबूती के लिए बहिष्कृत करने के लिए अच्छा कर सकते हैं।
  6. रास्ते में एनएफसी के रास्ते में सभी आने वाली तारों को एनएफडी में सामान्यीकृत करें। अन्यथा आप विश्वसनीय व्यवहार नहीं कर सकते हैं।

एक बार जब आप ऐसा करते हैं, आप सुरक्षित रूप से पैटर्न है कि \w या \p{script=Latin} या \p{alpha} और \p{lower} आदि शामिल हैं लिख सकते हैं और जानते हैं कि इन सभी क्या करेंगे the Unicode Standard says they should कर सकते हैं। मैं पाइथन यूनिकोड रेगेक्स व्यवसाय के इस व्यवसाय के बारे में अधिक जानकारी in this answer में समझाता हूं। छोटी कहानी हमेशा regexre का उपयोग करना है।

सामान्य यूनिकोड सलाह के लिए, मेरे पास यूनिकोड नियमित अभिव्यक्तियों के बारे में several talks from last OSCON भी है, जिनमें से अधिकांश अकेले तीसरे टॉक के अलावा पाइथन के बारे में नहीं है, लेकिन इनमें से अधिकतर अनुकूलनीय है।

अंत में, आपके दिल में भगवान (या कम से कम, यूनिकोड) के डर को रखने के लिए हमेशा this answer होता है।

1

उन सभी पात्रों का मिलान श्रेणी बनाएं जिन्हें आप मिलान करना चाहते हैं। यह बहुत, बहुत बड़ा हो सकता है। नहीं, "सभी कांजी" के लिए कोई रेगेक्स शॉर्टेंड नहीं है;)

शायद आप जो चाहते हैं उसके लिए मिलान करना आसान है, लेकिन फिर भी, यह वर्ग बहुत बड़ा हो जाएगा।

+0

मुझे नहीं पता था कि यह इतना मुश्किल होगा ... मैं सभी पाठों में वर्णों का हिस्टोग्राम बनाकर शुरू करूंगा मैं प्रक्रिया करना चाहता हूं ... – Baz

+0

यह रेगेक्स इंजन पर निर्भर करता है। आप कुछ इंजनों में स्क्रिप्ट प्रॉपर्टी पर मिलान कर सकते हैं, जैसे पर्ल, जहां आप हन स्क्रिप्ट का चयन कर सकते हैं (वे * हान * पात्र हैं, भले ही वे जापानी द्वारा भी उपयोग किए जाते हैं और वहां कांजी कहा जाता है)। – Joey

+0

निश्चित रूप से, आप * एक * स्क्रिप्ट के लिए ऐसा कर सकते हैं - लेकिन एक ही समय में * हर * के लिए नहीं (चलिए यहां हान/कांजी समस्याग्रस्तताओं पर चर्चा नहीं करते हैं ... यह एक लंबा, खूनी इतिहास है, नहीं, कई पात्र बिल्कुल समान नहीं हैं) – ty812

4

आप

\p{L} 

जो किसी भी यूनिकोड कोड बिंदु है कि एक स्क्रिप्ट का एक पत्र का प्रतिनिधित्व करता है से मेल खाता है पर मिलान कर सकते हैं। यही है, मान लीजिए कि वास्तव में आपके पास यूनिकोड-सक्षम रेगेक्स इंजन है, जिसे मैं वास्तव में पाइथन की आशा करता हूं।

+0

रूबी पर भी काम करता है :) – Aleksey

7

\ w विशेष अनुक्रम का उपयोग करने में क्या गलत है?

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

'\ w' मैचों में भी अंक [0-9]' और अंडरस्कोर '_' – Toto

+1

बहुत अच्छा है, मानक पायथन पुस्तकालय के तहत यह सही उत्तर है (हालांकि मैं हमेशा यूनिकोड अक्षर का उपयोग करता हूं)। ध्यान दें कि [यूटीएस # 18] (http://unicode.org/reports/tr18/#Categories) के अनुसार, यूनिकोड 6.0 में एक "शब्द" char à la 'w' 102,724 कोड बिंदु शामिल है और कोई भी जीसी = एल है (100,520), जीसी = एम (1,492), जीसी = एनडी (420), जीसी = एनएल (224), या जीसी = पीसी (10) कोड बिंदु। पायथन का 'पुनः' थोड़ा दिनांकित है, इसलिए मानक के साथ नहीं रखा गया है, लेकिन यह करीब-करीब है। यदि आप यूनिकोड मानक से बिल्कुल मेल खाना चाहते हैं तो आप मैथ्यू बार्नेट के 'रेगेक्स' का उपयोग कर सकते हैं; यह '\ p {अल्फा}' भी प्रदान करता है, जो आप यहां चाहते हैं। – tchrist

+0

@ एम 42: यह उससे कहीं अधिक जटिल है, लेकिन हाँ। पायथन की सामान्य 'पुनः' लाइब्रेरी [यूनिकोड के लिए अच्छा नहीं है] (http://stackoverflow.com/questions/7063420/perl-compatible-regular-expression-pcre-in-python/7066413#7066413), हालांकि यह करीब है [ आरएल 1.2 ए] (http://unicode.org/reports/tr18/# कॉम्पैबिलिटी_Properties) लेकिन प्रति मूलभूत गुणों की कमी [RL1.2] (http://unicode.org/reports/tr18/#Categories) और प्रति पूर्ण गुण [RL2.7] (http://www.unicode.org/reports/tr18/tr18-14.html#Full_Properties)। पाइथन में लगभग किसी भी यूनिकोड रेगेक्स काम के लिए आपको मैथ्यू बार्नेट की 'रेगेक्स' लाइब्रेरी का उपयोग करना चाहिए। – tchrist

1
 
import re 

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

यह पायथन 3 में काम करता है लेकिन यह अंडरस्कोर से भी मेल खाता है। हालांकि इस काश के रूप में काम करने के लिए लगता है:

 
import regex 

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

पुर्तगाली भाषा के लिए, कोशिश का उपयोग इस एक:

[a-zA-ZÀ-ú ]+ 
संबंधित मुद्दे