2011-09-09 14 views
5

यदि मेरे पास एकाधिक लाइनों के साथ एक बड़ी स्ट्रिंग है और मैं केवल उस पंक्ति के अंत तक एक लाइन के हिस्से से मेल खाना चाहता हूं, तो सबसे अच्छा तरीका क्या है ऐसा करने के लिए?एक स्ट्रिंग का मिलान भाग जब तक यह लाइन के अंत तक पहुंच नहीं जाता है (पायथन रेगेक्स)

तो, उदाहरण के लिए मेरे पास ऐसा कुछ है और मैं इसे नए लाइन चरित्र तक पहुंचने पर मिलान करना बंद करना चाहता हूं।

r"(?P<name>[A-Za-z\s.]+)" 

मैं एक previous answer में यह देखा:

$ - स्ट्रिंग, या एक पंक्ति के अंत के अंत तक मिलान इंगित करता है अगर बहु सक्षम है।

मेरा प्रश्न यह है कि आप उस उत्तर राज्य के लेखक के रूप में "बहुमुखी सक्षम" कैसे करते हैं? http://docs.python.org/library/re.html#module-contents

उत्तर

8

सीधे शब्दों में

r"(?P<name>[A-Za-z\t .]+)" 

का उपयोग यह ASCII अक्षरों, रिक्त स्थान, टैब या अवधि से मेल खाएगी। यह समूह में शामिल नहीं होने वाले पहले चरित्र पर रुक जाएगा - और न्यूलाइन नहीं हैं (जबकि वे \s में शामिल हैं, और इसके कारण यह अप्रासंगिक है कि मल्टीलाइन मोड चालू या बंद है या नहीं)

1

देखो तुम re.MULTILINEre.compile() से पीछे तर्क के रूप में पास करके बहु मिलान को सक्षम कर सकते हैं। हालांकि, इसके लिए देखने के लिए एक सूक्ष्मता है: चूंकि + क्वांटिफ़ायर लालची है, इसलिए यह नियमित अभिव्यक्ति जितनी संभव हो सके स्ट्रिंग से मेल खाती है, इसलिए यदि अगली पंक्ति अक्षरों और सफेद जगहों से बना है, तो रेगेक्स एक से अधिक मिलान कर सकता है लाइन ($के अंत से मेल खाता है स्ट्रिंग)।

    ताकि, बजाय न्यू लाइन सहित किसी भी खाली स्थान के मिलान की ( \s) अपने दोहराया वर्ण सेट कि न्यू लाइन से मेल नहीं खाता
  1. अपने रेगुलर एक्सप्रेशन से बदलें:

    इस के लिए तीन समाधान कर रहे हैं।

  2. बदलें +? को परिमाणक, गैर लालची ("कम से कम") + के संस्करण, इतना है कि यह संभव के रूप में कम के रूप में एक स्ट्रिंग से मेल खाते हैं और इसलिए पहले नई पंक्ति में बंद हो।
  3. बदलें
  4. यदि आपका कोड पहले प्रत्येक पंक्ति (text.split('\n') प्रयोग करने के लिए एक व्यक्ति स्ट्रिंग में पाठ विभाजित करने के लिए।
+0

यह सहायक नहीं है - मल्टीलाइन मोड को सक्षम करने से उसकी समस्या हल नहीं होगी। –

+0

बस अपने सवाल का जवाब दिया कि multiline को कैसे सक्षम करें ... – rocksportrocker

+1

ठीक है, और अगर कोई आपको पूछता है कि क्या उसे एक शिकंजा में ड्राइव करने के लिए ऊपर या नीचे हथौड़ा रखना चाहिए, तो आप उसे इसके बजाय एक स्क्रूड्राइवर का उपयोग करने के लिए नहीं कहेंगे :) –

2

पर flags पैरामीटर पर

+0

धन्यवाद समाधान के लिए! सबसे पहले लागू करने के लिए सबसे आसान लगता है। क्या आप विशेष रूप से जानते हैं कि मैं कैसे निर्दिष्ट कर सकता हूं कि मैं केवल एक स्पेस को किसी भी सफेद जगह के विपरीत मिलान करना चाहता हूं? मैंने दूसरे समाधान की कोशिश की लेकिन यह केवल एक ही चरित्र से मेल खाता है। –

+1

मेरा बुरा, उल्लेख किया जाना चाहिए - इन सभी समाधानों के लिए, आपको अंत में '$' (स्ट्रिंग का अंत) एंकर भी शामिल करना चाहिए।इस तरह, समाधान 2 के साथ, 're' को सबसे छोटी स्ट्रिंग मिलेगी जो रेगेक्स * से मेल खाती है * और * एक पंक्ति के अंत तक जाती है, जो आप चाहते हैं। समाधान 1 के लिए, एक स्थान को एक शाब्दिक स्थान द्वारा निर्धारित चरित्र में प्रदर्शित किया जा सकता है - कोई भागने की आवश्यकता नहीं है (यानी '[ए-ज़ा-जेड]] ') – azernik

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