2013-02-18 15 views
7

मेरे पास शब्दों का एक नियम है (वास्तव में मेरे पास क्रिया संयोग की घोंसला है, लेकिन यह प्रासंगिक नहीं है) और मैं उन्हें संयोजित करके एक रेगेक्स बनाना चाहता हूं।मैं शब्दों की सूची से रेगेक्स कैसे बना सकता हूं?

{ 
    'yo': 'hablaba', 
    'tú': 'hablabas', 
    'él': 'hablaba', 
    'nosotros': 'hablábamos', 
    'vosotros': 'hablabais', 
    'ellos': 'hablaban', 
    'vos': 'hablabas', 
} 

... बनाने के लिए:

'habl((aba(s|is|n)?)|ábamos)' # I think that's right 

मैं 'hablábamos' नहीं लगाते हैं तो यह आसान है - वे सभी एक ही उपसर्ग कर रहे हैं, और मैं प्राप्त कर सकते हैं:

'hablaba(s|is|n)?' 

... लेकिन मुझे एक सामान्य रूप चाहिए। क्या यह संभव है?

+1

क्या आप शब्दकोश में मूल्यों से नियमित अभिव्यक्ति * उत्पन्न करने की कोशिश कर रहे हैं? या आप शब्दकोश में मान * मान्य * करने के लिए एक नियमित अभिव्यक्ति लिखने की कोशिश कर रहे हैं। या पूरी तरह से कुछ और? – Johnsyweb

+1

मैं इसे उत्पन्न करना चाहता हूं। क्या मेरा टैग गलत है? –

उत्तर

6

हाँ, मेरा मानना ​​है कि यह संभव है क्या करना चाहिए की जरूरत है ।

आरंभ करने के लिए, इस तरह मैं समस्या को तोड़ दूंगा।

सबसे लंबे समय तक संभव स्ट्रिंग है जो गिरावट आई सभी मान की शुरुआत से मेल खाता है का पता लगाकर रूट की गणना करें:

>>> root = '' 
>>> for c in hablar['yo']: 
...  if all(v.startswith(root + c) for v in hablar.itervalues()): 
...   root += c 
...  else: 
...  break 
... 
>>> root 
'habl' 

जो भी शब्द का बचा है अंत के एक list बनाता है।

>>> endings = [v[len(root):] for v in hablar.itervalues()] 
>>> print endings 
['abas', 'aba', 'abais', 'aba', '\xc3\xa1bamos', 'aban', 'abas'] 

फिर आप डुप्लिकेट को बाहर निकाल सकते हैं:

>>> unique_endings = set(endings) 
>>> print unique_endings 
set(['abas', 'abais', '\xc3\xa1bamos', 'aban', 'aba']) 

फिर पाइप के साथ एक साथ इन अंत में शामिल होने:

>>> conjoined_endings = '|'.join(unique_endings) 
>>> print conjoined_endings 
abas|abais|ábamos|aban|aba 

नियमित अभिव्यक्ति बनाने जड़ के संयोजन बहुत आसान है और conjoined_endings स्ट्रिंग में स्ट्रिंग:

>>> final_regex = '{}({})'.format(root, conjoined_endings) 
>>> print final_regex 
habl(abas|abais|ábamos|aban|aba) 
+1

धन्यवाद @ जॉन्सवेब, हाँ जो मदद करता है। लेकिन मैं आपको वोट नहीं दे सकता :("15 प्रतिष्ठा की आवश्यकता है"। क्या मैं आपको स्वीकार करूंगा? –

+0

@ मालेना टोर्रेस: ​​आपका स्वागत है। उम्मीद है कि यह आपको शुरू हो जाएगा, भले ही मेरी भाषाई शर्तें बंद हों। मुझे उत्सुकता है कि आप क्यों नियमित अभिव्यक्तियों को इतना संपीड़ित करना चाहते हैं, आप बड़ी मात्रा में डेटा से निपट नहीं रहे हैं और अधिक जटिल अभिव्यक्तियां केवल आपके सत्यापन समय में शामिल होने जा रही हैं। – Johnsyweb

+1

मैंने अपना उदाहरण अधिक सरल बना दिया है, वास्तव में यह '{' यो ':' \ w + aba '}', और c जैसा होगा। आखिर में मैं अपने नियमों के लिए नियमित रूप से अनियमित क्रियाओं की तुलना करना चाहता हूं, और मेरे पास 'yo = {'imperfecto': '\ w + aba', 'presente': 'w w o o'} जैसे एक और निर्देश होगा। अनियमित क्रियाओं के लिए अधिक जटिल हालांकि, अब मैं यह देखने के लिए अपने विचार से शुरुआत कर रहा हूं कि मैं क्या कर सकता हूं। –

3

मैं तुम्हें एक कम चालाक दृष्टिकोण

>>> x={ 
... 'yo': 'hablaba', 
... 'tú': 'hablabas', 
... 'él': 'hablaba', 
... 'nosotros': 'hablábamos', 
... 'vosotros': 'hablabais', 
... 'ellos': 'hablaban', 
... 'vos': 'hablabas', 
... } 
>>> x 
{'t\xc3\xba': 'hablabas', 'yo': 'hablaba', 'vosotros': 'hablabais', '\xc3\xa9l': 'hablaba', 'nosotros': 'habl\xc3\xa1bamos', 'ellos': 'hablaban', 'vos': 'hablabas'} 
>>> x.values 
<built-in method values of dict object at 0x20e6490> 
>>> x.values() 
['hablabas', 'hablaba', 'hablabais', 'hablaba', 'habl\xc3\xa1bamos', 'hablaban', 'hablabas'] 
>>> "|".join(x.values()) 
'hablabas|hablaba|hablabais|hablaba|habl\xc3\xa1bamos|hablaban|hablabas' 

के लिए आप सिर्फ एक प्रत्यावर्तन ऑपरेटर के साथ हैश मान शामिल होते हैं तो फिर यह आप क्या चाहते हैं

+1

धन्यवाद Vorsprung :) लेकिन मेरे पास बहुत सारे शब्द और अन्य संयोग हैं (जो मैंने दिया है वह अपूर्ण संयोग है, लगभग 15 और हैं) और मैं बहुत अधिक जगह का उपयोग नहीं करना चाहता हूं। लेकिन हाँ आपका विचार काम करता है :) –

+1

मुझे हमेशा लगता है कि कंप्यूटर मेमोरी मेरे मूल्यवान समय से सस्ता है :) – Vorsprung

+0

निश्चित रूप से इसे सरल रखने के लिए कहा जाना बहुत कुछ है! – Johnsyweb

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