2012-11-07 14 views
7

के साथ एक रेगेक्स स्ट्रिंग कैसे भरें मैं स्ट्रिंग के साथ regex चर भरना चाहता हूं।पैरामीटर

import re 

hReg = re.compile("/robert/(?P<action>([a-zA-Z0-9]*))/$") 
hMatch = hReg.match("/robert/delete/") 
args = hMatch.groupdict() 

args variable अब {"action": "delete"} के साथ एक नियम है।

मैं इस प्रक्रिया को कैसे उलट सकता हूं? Args dict और regex पैटर्न के तर्क के साथ, मैं स्ट्रिंग "/ रॉबर्ट/हटाएं /" कैसे प्राप्त कर सकता हूं?

इस तरह एक कार्य करना संभव है?

def reverse(pattern, dictArgs): 

आप

+0

आप मान जो करने के लिए अपने स्ट्रिंग का वर्णन का एक शब्दकोश है, तो विस्तार है कि आप इसे में रुचि रखते हैं ... तुम क्यों की आवश्यकता होगी उस स्ट्रिंग को फिर से बनाने के लिए एक regex? आपके पास पहले से ही सभी बिट्स हैं जो एक फर्क पड़ता है। बस एक ऐसा फ़ंक्शन लिखें जो उन बिट्स को लेता है और एक स्ट्रिंग बनाता है। (दूसरे शब्दों में, नहीं, यह संभव नहीं है और आप शायद अपना समय बर्बाद कर रहे हैं।) – Tomalak

+0

मैं इस "फीचर" को एक यूआरएल स्ट्रिंग प्राप्त करने के लिए Django में उपयोग किए गए रिवर्स() जैसे फ़ंक्शन को कार्यान्वित करना चाहता हूं। यह संभव है कि Django तर्क के साथ "ब्रूट-बल" पैटर्न संभव है? – 0xBAADF00D

+1

यदि बिलकुल भी, यह एक पायथन चीज़ है, न कि Django चीज़। लेकिन मेरा मुद्दा यह है। उदाहरण के लिए, आप कैसे विपरीत होंगे, "//robe [या] t?/(? पी ((?! Foo) [a-zA-Z0 -9] *))" '? मैचों की सूची से वापस मूल स्ट्रिंग में जाने का कोई तरीका नहीं है क्योंकि रेगेक्स में वैकल्पिक और सशर्त भाग होते हैं जो एक दूसरे पर निर्भर करते हैं। तो या तो आप रेगेक्स के एक * अत्यंत * संकीर्ण उप-सेट को परिभाषित करते हैं जिसे इसके लिए एक पार्सर की अनुमति है और लिखना है, शायद अभी भी कुछ पक्ष-मामलों को याद कर रहा है और खुद को सीमित कर रहा है - या आप अपना समय अधिक उत्पादक रूप से खर्च करते हैं। ;) रेगेक्स मिलान एक तरफा सड़क है। – Tomalak

उत्तर

2

इस समारोह में क्या करना चाहिए यह

def reverse(regex, dict): 
    replacer_regex = re.compile(''' 
     \(\?P\<   # Match the opening 
      (.+?)  # Match the group name into group 1 
     \>\(.*?\)\)  # Match the rest 
     ''' 
     , re.VERBOSE) 

    return replacer_regex.sub(lambda m : dict[m.group(1)], regex) 

आप मूल रूप से (\? पी ...) ब्लॉक से मेल खाते हैं और dict से एक मूल्य के साथ बदलें।

संपादित करें: regex मेरे exmple में regex स्ट्रिंग है। आप द्वारा

regex_compiled.pattern 

EDIT2 गपशप से प्राप्त कर सकते हैं: वर्बोज़ regex जोड़ा

+0

यह फ़ंक्शन मेरे प्रोजेक्ट में अच्छी तरह से काम करता है, धन्यवाद! – 0xBAADF00D

0

वास्तव में धन्यवाद, मैं सोचता है कि वह कुछ संकीर्ण मामलों के लिए संभव है, लेकिन बहुत जटिल बात "सामान्य मामले में"।

आपको कुछ प्रकार की परिमित राज्य मशीन लिखना होगा, अपनी रेगेक्स स्ट्रिंग को पार्स करना होगा, और विभिन्न हिस्सों को विभाजित करना होगा, फिर इन हिस्सों के लिए उचित कार्रवाई करें।

नियमित प्रतीकों के लिए - परिणाम स्ट्रिंग में बस "जैसा है" डालें। नामित समूहों के लिए - उनके स्थान पर dictArgs से मूल्य डालें वैकल्पिक ब्लॉक के लिए - इसके कुछ मान

और इसी तरह से करें।

एक requllar अभिव्यक्ति अक्सर तारों के बड़े (या यहां तक ​​कि अनंत) सेट से मेल खा सकता है, इसलिए यह "रिवर्स" फ़ंक्शन बहुत उपयोगी नहीं होगा।