2011-08-03 13 views
109

मैं का उपयोग regex के अंदर करना चाहता हूं, मैं इसे Python में कैसे कर सकता हूं?एक नियमित अभिव्यक्ति के अंदर एक चर का उपयोग कैसे करें?

TEXTO = sys.argv[1] 

if re.search(r"\b(?=\w)TEXTO\b(?!\w)", subject, re.IGNORECASE): 
    # Successful match 
else: 
    # Match attempt failed 
+7

आप स्ट्रिंग संयोजन का उपयोग –

उत्तर

160

आप एक स्ट्रिंग के रूप regex का निर्माण करने के लिए है।

+12

+1, मैंने इसे पहले दस्तावेज़ों में नहीं देखा था! – bdeniker

+2

क्या होगा यदि आपका चर पहले हो जाए? 'आर' '+ फू +' बार '? – deed02392

+0

@ deed02392 'r''' जरूरी नहीं है यदि आप' re.escape (foo) 'करते हैं, जिसे आपको वैसे भी करना चाहिए। असल में, मुझे लगता है कि आप 'आर' उपसर्ग के बावजूद यूनिकोड स्ट्रिंग के रूप में जो भी दिया गया है, उसे 'पुनः' बताता है। – OJFord

19
rx = r'\b(?<=\w){0}\b(?!\w)'.format(TEXTO) 
+0

+1 के बाद से स्ट्रिंग प्रक्षेप होने वाला है। – Chris

+3

:-) मुझे संदेह है कि स्ट्रिंग इंटरपोलेशन कभी भी दूर जाएगा ... –

+1

@phasetwenty: नहीं, यह नहीं है। मुझे प्रारूप अधिक पसंद है, लेकिन पायथन कोर देव पुराने प्रिंटफ सिंटैक्स को हटाने की योजना नहीं बनाते हैं। Re.escape संदर्भ के लिए –

32
if re.search(r"\b(?<=\w)%s\b(?!\w)" % TEXTO, subject, re.IGNORECASE): 

यह दर्ज हो जाएगा क्या एक स्ट्रिंग के रूप regex में texto में है।

TEXTO = sys.argv[1] 
my_regex = r"\b(?=\w)" + re.escape(TEXTO) + r"\b(?!\w)" 

if re.search(my_regex, subject, re.IGNORECASE): 
    etc. 

नोट तो re.escape के उपयोग कि यदि आपके पाठ विशेष वर्ण है, वे इस तरह के रूप में व्याख्या की नहीं किया जाएगा:

1

मैं सहमत सब से ऊपर जब तक:

sys.argv[1] था जैसे Chicken\d{2}-\d{2}An\s*important\s*anchor

sys.argv[1] = "Chicken\d{2}-\d{2}An\s*important\s*anchor" 

कुछ आप, re.escape उपयोग करने के लिए एक regex

की तरह व्यवहार करते हैं, क्योंकि उस मामले में आप इसे चाहते हैं नहीं करना चाहते
TEXTO = sys.argv[1] 

if re.search(r"\b(?<=\w)" + TEXTO + "\b(?!\w)", subject, re.IGNORECASE): 
    # Successful match 
else: 
    # Match attempt failed 
1

मुझे एक दूसरे के समान उपयोगकर्ता नामों की खोज करने की आवश्यकता है, और नेड बचेचेल्डर ने क्या कहा था विश्वसनीय रूप से सहायक। हालांकि, मैंने पाया मैं क्लीनर उत्पादन किया था जब मैं re.compile इस्तेमाल किया मेरी फिर से खोज पद बनाने के लिए: का उपयोग कर

pattern = re.compile(r"("+username+".*):(.*?):(.*?):(.*?):(.*)" 
matches = re.findall(pattern, lines) 

आउटपुट मुद्रित किया जा सकता है:

print(matches[1]) # prints one whole matching line (in this case, the first line) 
print(matches[1][3]) # prints the fourth character group (established with the parentheses in the regex statement) of the first line. 
1

मैं इसे बहुत सुविधाजनक निर्माण करने के लिए लगता है कई छोटे पैटर्न को एक साथ स्ट्रिंग करके एक नियमित अभिव्यक्ति पैटर्न।

import re 

string = "begin:id1:tag:middl:id2:tag:id3:end" 
re_str1 = r'(?<=(\S{5})):' 
re_str2 = r'(id\d+):(?=tag:)' 
re_pattern = re.compile(re_str1 + re_str2) 
match = re_pattern.findall(string) 
print(match) 

आउटपुट:

[('begin', 'id1'), ('middl', 'id2')] 
संबंधित मुद्दे