सवाल ध्वज के साथ पाइथन re.sub सभी घटनाओं को प्रतिस्थापित नहीं करता है


पायथन डॉक्स कहते हैं:

re.MULTILINE: निर्दिष्ट होने पर, पैटर्न वर्ण '^' स्ट्रिंग की शुरुआत में और प्रत्येक पंक्ति की शुरुआत में (प्रत्येक नई लाइन के तुरंत बाद) मिलान करता है ... डिफ़ॉल्ट रूप से, '^' केवल स्ट्रिंग की शुरुआत में ही मेल खाता है ...

तो मुझे निम्नलिखित अप्रत्याशित परिणाम मिलने पर क्या चल रहा है?

>>> import re
>>> s = """// The quick brown fox.
... // Jumped over the lazy dog."""
>>> re.sub('^//', '', s, re.MULTILINE)
' The quick brown fox.\n// Jumped over the lazy dog.'

44
2017-09-03 21:00


मूल




जवाब:


की परिभाषा को देखो re.sub:

sub(pattern, repl, string[, count])

चौथा तर्क गिनती है, आप इसका उपयोग कर रहे हैं re.MULTILINE (जो 8 है) गिनती के रूप में, ध्वज के रूप में नहीं।

यदि आप झंडे का उपयोग करना चाहते हैं तो आपको अपने रेगेक्स को संकलित करना होगा।

re.sub(re.compile('^//', re.MULTILINE), '', s)

flags तर्क Python 2.7 में जोड़ा गया था, इसलिए पूर्ण परिभाषा अब है:

re.sub(pattern, repl, string[, count, flags])

जिसका अर्थ है कि:

re.sub('^//', '', s, flags=re.MULTILINE)

काम करता है।


99
2017-09-03 21:08



यह बेहतर होगा re.compile('^//', re.M).sub('', s) - SilentGhost
अगर आप इसे फ़्लैग करते हुए ध्वज को बताते हैं तो आपको इसे संकलित करने की आवश्यकता नहीं है - pseudosudo
@pseudosudo झंडे के तर्कों को पायथन 2.7 में जोड़ा गया था, जो इस उत्तर को पोस्ट करते समय मौजूद नहीं था। मैंने जवाब में जानकारी जोड़ दी है। - agf


re.sub('(?m)^//', '', s)

9
2018-03-25 16:10





की पूरी परिभाषा re.sub है:

re.sub(pattern, repl, string[, count, flags])

जिसका अर्थ यह है कि यदि आप पाइथन को बताते हैं कि पैरामीटर क्या हैं, तो आप पास कर सकते हैं flags गुजरने के बिना count:

re.sub('^//', '', s, flags=re.MULTILINE)

या, अधिक संक्षेप में:

re.sub('^//', '', s, flags=re.M)

6
2017-08-30 18:33



मेरी टिप्पणी देखें और दूसरे उत्तर में संपादित करें। - agf
@agf आह, मैंने तारीख को देखने के लिए नहीं सोचा था। - pseudosudo