2010-11-25 12 views
5

कोड:

str = '<br><br />A<br />B' 
print(re.sub(r'<br.*?>\w$', '', str)) 

यह <br><br />A लौटने की उम्मीद है, लेकिन यह एक खाली स्ट्रिंग '' रिटर्न!

कोई सुझाव?

+2

कृपया एक चर नाम के रूप में कभी भी 'str' का उपयोग न करें। –

+0

आपके सुझाव के लिए धन्यवाद। –

+1

उह ... अरे ... आप नियमित अभिव्यक्तियों के साथ HTML को पार्स नहीं कर रहे हैं, है ना? – detly

उत्तर

6

लोभ से बाएं से दाएं काम करता है, लेकिन अन्यथा नहीं। इसका मूल रूप से अर्थ है "जब तक आप मिलान नहीं कर लेते तब तक मेल न करें"। यहां क्या हो रहा है:

  1. रेगेक्स इंजन स्ट्रिंग की शुरुआत में <br से मेल खाता है।
  2. .*? अब के लिए अनदेखा किया गया है, यह आलसी है।
  3. > से मिलान करने का प्रयास करें, और सफल हो जाता है।
  4. \w से मिलान करने का प्रयास करें और विफल रहता है। अब यह दिलचस्प है - इंजन बैकट्रैकिंग शुरू करता है, और .*? नियम देखता है। इस मामले में, . पहले > से मेल खाता है, इसलिए अभी भी उस मैच के लिए आशा है।
  5. यह तब तक जारी रहता है जब तक रेगेक्स स्लैश तक पहुंच न जाए। फिर >\w मिलान कर सकते हैं, लेकिन $ विफल रहता है। फिर, इंजन वापस आलसी .* शासन के लिए आता है, और जब तक यह <br><br />A<br />B

सौभाग्य से मेल खाता मिलान रहता है,, वहाँ एक आसान समाधान: तुम नहीं <br[^>]*>\w$ बदलकर आपके टैग के बाहर मिलान की अनुमति देते हैं, तो यह अंतिम घटना को प्रतिस्थापित करना चाहिए।
कड़ाई से बोलते हुए, यह HTML के लिए अच्छा काम नहीं करता है, क्योंकि टैग विशेषताओं में > वर्ण हो सकते हैं, लेकिन मुझे लगता है कि यह सिर्फ एक उदाहरण है।

1

गैर-लालची बाद में शुरू नहीं होगी। यह पहले <br से मेल खाता है और बाकी से लालच से मेल नहीं खाएगा, जिसे वास्तव में स्ट्रिंग के अंत में जाना होगा क्योंकि आप $ निर्दिष्ट करते हैं।

जिस तरह से आप चाहते थे काम करने के लिए,

/<br[^<]*?>\w$/ 

का उपयोग लेकिन आम तौर पर, यह regex का उपयोग करने के लिए कुछ विशेषता के मूल्य के रूप में HTML पार्स करने के लिए < या > उस में हो सकता है अनुशंसित नहीं है।

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

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