2013-09-02 9 views
5

का उपयोग कर अनुच्छेद से कैसे मिलान करें मैं पाठ के भीतर पैराग्राफ से मिलान करने की कोशिश करते समय पाइथन रेगेक्स के साथ संघर्ष कर रहा हूं, लेकिन मैं सफल नहीं हुआ हूं। मुझे पैराग्राफ की शुरुआत और अंत स्थिति प्राप्त करने की आवश्यकता है।रेगेक्स

एक पाठ का एक उदाहरण:

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod 
tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At 
vero eos et accusam et justo duo dolores et ea rebum. 

Stet clita kasd gubergren, 
no sea takimata sanctus est Lorem ipsum dolor sit amet. 

Ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod 
tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At 
vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, 
no sea takimata sanctus est Lorem ipsum dolor sit amet. 

इस उदाहरण मामले में, मुझे अलग से सभी अनुच्छेदों (खाली लाइनों के बिना) क्रमश: गर्व द्वारा संचालित, Stet और Ipsum के साथ शुरू से मिलान करना चाहते हैं। क्या किसी को कोई विचार है कि यह कैसे करें?

+1

वहाँ एक कारण है कि आप regex के साथ ऐसा करना चाहते हैं कर रहे हैं? डबल-न्यूलाइन सीमांकित अनुच्छेदों को विभाजित करने के रूप में सरल कुछ के लिए आप केवल 'paragraph.split (' \ n \ n ') ' –

+0

का उपयोग कर सकते हैं, मुझे अनुच्छेदों की शुरुआत और अंत स्थिति में रुचि है, वास्तविक तारों में नहीं। मुझे इसका उल्लेख करना चाहिए था। –

उत्तर

3

आप इस तरह डबल न्यू लाइन पर विभाजित कर सकते हैं:

paragraphs = re.split(r"\n\n", DATA) 

संपादित करें:

for match in re.finditer(r'(?s)((?:[^\n][\n]?)+)', DATA): 
    print match.start(), match.end() 

# Prints: 
# 0 214 
# 215 298 
# 299 589 
:
से मेल खाता है के रूप में पैराग्राफ पर कब्जा करने के लिए, ताकि आप उनकी प्रारंभ और अंत बिंदु प्राप्त कर सकते हैं, ऐसा करने के
+0

मिलान वस्तु प्राप्त करने के लिए मैं इसका उपयोग कैसे कर सकता हूं? –

2

विभाजन का उपयोग करते हुए एक ही रास्ता है, तो आप इस तरह भी नियमित रूप से अभिव्यक्ति के साथ ऐसा कर सकते हैं:

paragraphs = re.search('(.+?\n\n|.+?$)',TEXT,re.DOTALL) 

.+? एक आलसी मैच है, यह सबसे छोटी सबस्ट्रिंग से मेल खाएगा जो पूरे रेगेक्स से मेल खाता है। अन्यथा, यह सिर्फ पूरी स्ट्रिंग से मेल खाएगा।

तो बुनियादी तौर पर यहाँ हम जो एक रिक्त पंक्ति (\n\n) या स्ट्रिंग के अंत ($) द्वारा समाप्त होता है वर्ण (.+?) का एक अनुक्रम लगाना चाहते हैं। re.DOTALL ध्वज डॉट को न्यूलाइन से मेल खाता है (हम भी पैराग्राफ से मिलान करना चाहते हैं जिसमें तीन लाइनों के बिना रिक्त रेखाएं हैं)

+0

आपके उत्तर के लिए धन्यवाद। हालांकि, यह पैटर्न खाली लाइनों से मेल खाता है, जो सही नहीं है। –

0

न्यूलाइन प्रतीक क्या है? हमें न्यू लाइन प्रतीक लगता है चलो है '\ r \ n', आप पैराग्राफ में प्रकाशित किया साथ शुरू मिलान करना चाहते हैं, तो आप इस तरह कर सकते हैं:

pattern = re.compile('\r\nLorem.*\r\n') 
str = '...' # your source text 
matchlist = re.findall(pattern, str) 

matchlist सभी paragragh गर्व द्वारा संचालित के साथ शुरू शामिल होंगे। और दूसरे दो शब्द समान हैं।

+0

पाइथन में न्यूलाइन चार आमतौर पर \ n है। और आपका पैटर्न काम नहीं करता है। –

+0

क्षमा करें, मैंने गलती की है। आप इसे आजमा सकते हैं: 'p = re.compile ('^ Lorem। * \ N') matchlist = re.findall (पी, एस) 'फिर आपको लोरम के साथ अनुच्छेदों की सूची मिल जाएगी –

0

^(.+?)\n\s*\n 

या

^(.+?)\r\n\s*\r\n 

प्रयास करें

0

मैं डिफ़ॉल्ट जावा रेगुलर एक्सप्रेशन से इंजन के साथ की सिफारिश की regex का उपयोग करने की कोशिश की तो बस मत भूलना पाठ के अंत में अतिरिक्त नई लाइन संलग्न । इसने मुझे कई बार स्टैक ओवरफ्लो एक्सेप्शन दिया, इसलिए अंत में मैंने रेगेक्स को फिर से लिखा और इसे थोड़ा और अनुकूलित किया।

तो यह जावा में मेरे लिए ठीक काम कर रहा है:

(?s)(.*?[^\:\-\,])(?:$|\n{2,}) 

यह भी नई लाइनों के बिना दस्तावेज़ के अंत संभालती है और लाइनों जो साथ समाप्त होता है concat की कोशिश करता है ':' '-' या ',' अगले अनुच्छेद के लिए।

और से बचने के लिए है कि कारतूस (सफेद स्थान या टैब) अनुगामी ऊपर वर्णित सुविधा टूट जाता है मैं निम्नलिखित regex के साथ पहले उन्हें अलग करना हूँ:

(?m)[[:blank:]]+$