2011-04-15 19 views
7

रूबी रेगेक्स और पायथन रेगेक्स के बीच कोई वास्तविक अंतर है?रुबी रेगेक्स बनाम पायथन रेगेक्स

मैं दोनों में कोई अंतर नहीं ढूंढ पा रहा हूं, लेकिन कुछ याद आ सकता है।

+0

हम्म? आप "ढूंढने" की कोशिश कर रहे हैं? रेगेक्स स्वयं एक भाषा है, इसलिए लाइब्रेरी में थोड़ा अलग झंडे हो सकते हैं लेकिन कुल मिलाकर सिंटैक्स इसका समर्थन करने वाली हर चीज़ के बीच समान है। – OneOfOne

+1

रूबी 1.8 या रूबी 1.9? वहाँ एक बड़ा अंतर है। – sawa

+3

देखें - http://www.regular-expressions.info/refflavors.html – YOU

उत्तर

6

पिछली बार मैंने चेक किया, वे अपने यूनिकोड समर्थन में काफी भिन्न थे। 1.9 में रूबी कम से कम कुछ सीमित यूनिकोड समर्थन है। मुझे विश्वास है कि एक या दो यूनिकोड गुण अब तक समर्थित हो सकते हैं। शायद सामान्य श्रेणियां और शायद स्क्रिप्ट उन दोनों थे जिनके बारे में मैं सोच रहा हूं।

पायथन में एक ही समय में कम से कम यूनिकोड समर्थन है। पाइथन Unicode Regular Expressions पर यूटीएस # 18 से RL1.2a "Compatability Properties" की आवश्यकताओं को पूरा करना संभव बनाता है।

उस ने कहा, मैथ्यू बार्नेट (मैब) द्वारा वहां वास्तव में एक अच्छी पायथन लाइब्रेरी है जो अंत में पाइथन रेगेक्स में कुछ यूनिकोड गुण जोड़ती है। वह दो सबसे महत्वपूर्ण लोगों का समर्थन करता है: सामान्य श्रेणियां, और स्क्रिप्ट गुण। इसमें कुछ अन्य दिलचस्प विशेषताएं भी हैं। यह कुछ अच्छे प्रचार के हकदार है।

मुझे लगता है कि रूबी या पायथन का कोई भी यूनिकोड बहुत अच्छा नहीं है, हालांकि हर दिन अधिक से अधिक किया जाता है। विशेष रूप से, हालांकि, ऊपर उल्लिखित यूनिकोड नियमित अभिव्यक्तियों के लिए नंगे स्तरों की आवश्यकता नहीं है। उदाहरण के लिए, आरएल 1.2 की आवश्यकता है कि कम से कम 11 गुण समर्थित हों: General_Category, Script, Alphabetic, Uppercase, Lowercase, White_Space, Noncharacter_Code_Point, Default_Ignorable_Code_Point, ANY, ASCII, और ASSIGNED

मुझे लगता है कि पाइथन केवल आपको उनमें से कुछ को प्राप्त करने देता है, और केवल एक चौराहे के रास्ते में। बेशक, इन 11 से परे कई अन्य संपत्तियां हैं।

जब आप यूनिकोड समर्थन की तलाश में हैं, तो पाठ्यक्रम के नियमित अभिव्यक्तियों पर केवल यूटीएस # 10 से अधिक है, हालांकि यह सबसे महत्वपूर्ण है प्रश्न और न तो रूबी और न ही पुइथन स्तर 1 अनुपालनशील हैं। यूनिकोड के अन्य महत्वपूर्ण पहलुओं में UAX # 15, UAX # 14, UTS # 18, UAX # 11, UAX # 29, और निश्चित रूप से महत्वपूर्ण UAX # 44 शामिल हैं। पाइथन में कम से कम दो लोगों के लिए पुस्तकालय हैं, मुझे पता है। मुझे नहीं पता कि वे मानक हैं।

लेकिन जब नियमित अभिव्यक्ति समर्थन की बात आती है, तो उन दोनों की तुलना में समृद्ध विकल्प हैं, आपको पता है। :)

+0

मुझे लगता है कि आखिरी बार चेक किए जाने के बाद रूबी रेगेक्स समर्थन अधिक शक्तिशाली हो गया है: https://github.com/ruby/ruby/blob/trunk/doc/re.rdoc – steenslag

+0

@steenslag नहीं, रूबी regexes अभी भी यूनिकोड पर चूसना। Charclass संक्षेप अभी भी आरएल 1.2 ए के साथ कदम से बाहर हैं, जो पहले के एएससीआईआई रेत में फंस गए थे। POSIX प्रोप के साथ ही। और '\ p {lower}' जैसी चीजें यूनिकोड मानक के साथ कट्टरपंथी संघर्ष में हैं, जो कहती हैं कि यह सभी लोअरकेस होना चाहिए, केवल अक्षरों के लिए नहीं। इसके अलावा, केवल दो गुण समर्थित हैं: सामान्य_Category और स्क्रिप्ट गुण। '\ X' या equiv के माध्यम से grapheme क्लस्टर के लिए कोई समर्थन नहीं है। कोई '\ N {NAME}' समर्थन नहीं है। यह लेवल 1 के लिए बाकी चीजें गायब है, यूनिकोड समर्थन का सबसे कम स्वीकार्य स्तर। – tchrist

+0

@steenslag: इस ग्राफ़ीम क्लस्टर से मेल खाने के लिए इस पूरी तरह से उचित, और वास्तव में बहुत ही आवश्यक, पैटर्न पर विचार करें- एक उपयोगकर्ता द्वारा लगाए गए चरित्र- जिसमें "ए" और एक circumflex है, लेकिन जहां आप पहले सामान्यीकरण फॉर्म नहीं जानते हैं, जहां आप पूर्णविड्थ "ए" और इस तरह के मिलान के लिए चाहते हैं, और जहां उनके बीच अन्य अंक गिर सकते हैं: 'एनएफकेडी ($ एस) = ~/(? = ए \ पी {ग्रैफमे_एक्सएंडेंड} * \ N {सम्मिलित सर्किफलेक्स एक्सेसेंट}} \ एक्स/ix'। मैं रूबी में ऐसा कैसे करूँ?न तो रुबी और न ही पायथन भी {यूनिकोड रेगेक्स पर यूटीएस # 18 की आवश्यकताओं के ** ** ** ** (http://unicode.org/reports/tr18/) की आवश्यकताओं को पूरा करने के करीब आ सकते हैं। * अब देखें? * – tchrist

1

रुबी और पायथन के लिए नियमित अभिव्यक्ति पुस्तकालय दो पूरी तरह से स्वतंत्र टीमों द्वारा विकसित किए जाते हैं। भले ही वे अब समान हैं (और मुझे यकीन नहीं होगा कि वे हैं), इस बात की कोई गारंटी नहीं है कि वे भविष्य में कभी-कभी अलग नहीं होंगे।

सबसे सुरक्षित स्थिति यह मानना ​​है कि वे अब अलग हैं, और मान लें कि वे भविष्य में अलग-अलग रहेंगे।

5

मुझे नियमित अभिव्यक्तियों के लिए पर्ल से प्रेरित रूबी में/पैटर्न/वाक्यविन्यास पसंद है। पायथन का re.compile ("पैटर्न") वास्तव में मेरे लिए सुरुचिपूर्ण नहीं है। रुबी में सिंथेटिक चीनी और तथ्य यह है कि नियमित अभिव्यक्तियां पाइथन में एक अलग पुनः मॉड्यूल हैं, जब मुझे नियमित अभिव्यक्तियों की बात आती है तो मुझे रुबी की तरफ झुकता है।

इसके अलावा, मुझे सामान्य नियमित अभिव्यक्ति प्रोग्रामिंग परिप्रेक्ष्य से बहुत अंतर दिखाई नहीं देता है। दोनों भाषाओं में काफी व्यापक और ज्यादातर समान आरई समर्थन है। प्रदर्शन अंतर हो सकते हैं (पायथन परंपरागत रूप से बेहतर प्रदर्शन किया गया है) और पायथन के पास नियमित रूप से यूनिकोड नियमित अभिव्यक्ति समर्थन भी है।

+0

मानक में से कितने [मानक यूनिकोड गुण] (http://unicode.org/reports/tr44/#Property_Index) पायथन समर्थन करता है? साथ ही, [उचित ग्रैफेम क्लस्टर्स] (http://unicode.org/reports/tr29/#Default_Grapheme_Cluster_Table) के साथ पाइथन का समर्थन कैसे होता है, जैसे '\ X' या शायद' \ p {Grapheme_Base} \ p {Grapheme_Extend के माध्यम से) } * '? क्या यह पूर्ण 1 है: असंवेदनशील मैचों के मामले में कई यूनिकोड केस फोल्डिंग? क्या आप विश्वसनीय रूप से किसी भी संभावित यूनिकोड कोड बिंदु का उपयोग कर सकते हैं, या फिर भी आप उस बीएमपी प्रतिबंध (जो यूनिकोड forbids, * ahem *) द्वारा hamstrung हैं? बीटीडब्ल्यू, मैं बस आपको रिबिंग कर रहा हूं, इसे बहुत गंभीरता से न लें। – tchrist

+4

मैं दृढ़ता से आपसे सहमत हूं कि लाइब्रेरी के साथ पक्ष में नाखुश होने की बजाए कोर भाषा को कसकर जोड़कर regexes को उपयोगिता में वास्तव में बड़ा अंतर बनाता है। – tchrist

2

यदि प्रश्न केवल रेगेक्स के बारे में है: न तो। पर्ल का प्रयोग करें।

आपको उन अन्य गैर-रेगेक्स मुद्दों के आधार पर उन भाषाओं के बीच चयन करना चाहिए जिन्हें आप हल करने का प्रयास कर रहे हैं और उस भाषा में सामुदायिक समर्थन जो आपके प्रयास के क्षेत्र में है।

आप वास्तव में केवल regex समर्थन के आधार पर एक भाषा उठा रहे हैं, तो - चुनें पर्ल ...

1

रूबी के Regexp#match विधि पायथन के re.search(), नहीं re.match() के बराबर है। re.search() और Regexp#match स्ट्रिंग में कहीं भी पहले मैच की तलाश करें। re.match() केवल एक स्ट्रिंग की शुरुआत में एक मैच के लिए लग रहा है।

re.match() के बराबर करने के लिए, रूबी नियमित अभिव्यक्ति को ^ से शुरू करने की आवश्यकता होगी, जो स्ट्रिंग की शुरुआत से मेल खाता है।

Regexp#match के समतुल्य प्रदर्शन करने के लिए, एक पायथन नियमित अभिव्यक्ति को .* से शुरू करने की आवश्यकता होगी, जो शून्य या अधिक वर्णों से मेल खाता है।