2008-09-22 16 views
5

पैराग्राफ को विभाजित करने के लिए पाइथन में उपयोग करने के लिए नियमित अभिव्यक्ति कैसे लिखती है?पाइथन नियमित अभिव्यक्ति को अनुच्छेदों को विभाजित करने के लिए

एक अनुच्छेद 2 लाइनब्रेक्स (\ n) द्वारा परिभाषित किया गया है। लेकिन लाइन ब्रेक के साथ किसी के पास रिक्त स्थान/टैब की एक साथ हो सकती है, और इसे अभी भी अनुच्छेद के रूप में माना जाना चाहिए।

मैं अजगर का उपयोग कर रहा हूं ताकि समाधान पाइथन के regular expression syntax का विस्तार कर सके। ((?P...) सामान का उपयोग कर सकते)

उदाहरण:

the_str = 'paragraph1\n\nparagraph2' 
# splitting should yield ['paragraph1', 'paragraph2'] 

the_str = 'p1\n\t\np2\t\n\tstill p2\t \n  \n\tp3' 
# should yield ['p1', 'p2\t\n\tstill p2', 'p3'] 

the_str = 'p1\n\n\n\tp2' 
# should yield ['p1', '\n\tp2'] 
सबसे अच्छा मैं के साथ आ सकता है

है: r'[ \t\r\f\v]*\n[ \t\r\f\v]*\n[ \t\r\f\v]*', अर्थात

import re 
paragraphs = re.split(r'[ \t\r\f\v]*\n[ \t\r\f\v]*\n[ \t\r\f\v]*', the_str) 

लेकिन यह बदसूरत है। कुछ भी बेहतर है?

संपादित:

सुझाव को अस्वीकार कर दिया:

r'\s*?\n\s*?\n\s*?' -> यही कारण है कि उदाहरण 2 बनाना होगा और 3, असफल के बाद से \s\n भी शामिल है, तो यह 2 \n से अधिक के साथ पैरा टूट जाता है की अनुमति होगी।

उत्तर

4

दुर्भाग्यवश "अंतरिक्ष नहीं बल्कि एक नई लाइन" लिखने का कोई अच्छा तरीका नहीं है।

मुझे लगता है कि सबसे अच्छा तुम कर सकते हो x संशोधक के साथ कुछ जगह जोड़ सकते हैं और कुरूपता थोड़ा बाहर कारक करने की कोशिश है, लेकिन यह संदिग्ध है: (?x) (?: [ \t\r\f\v]*? \n){2} [ \t\r\f\v]*?

आप, साथ ही चरित्र वर्ग के लिए एक subrule बनाने की कोशिश कर सकते और इसे तीन बार interpolating।

+2

वहाँ है। [^ \ एस \ n] :) –

0

लगभग वही, लेकिन गैर लालची क्वांटिफायर का उपयोग करके और व्हाइटस्पेस अनुक्रम का लाभ लेना।

\s*?\n\s*?\n\s*? 
+0

कि उदाहरण 2 होगा असफल से प्रेरित होकर, क्योंकि \ s \ n भी शामिल है। – nosklo

2

क्या आप सादे परीक्षण में किसी दस्तावेज़ की संरचना को कम करने की कोशिश कर रहे हैं? क्या आप docutils कर रहे हैं?

आप अपने आप को रोल करने के बजाय Docutils parser का उपयोग करने में सक्षम हो सकते हैं।

1

नहीं regexp लेकिन वास्तव में सुरुचिपूर्ण:

from itertools import groupby 

def paragraph(lines) : 
    for group_separator, line_iteration in groupby(lines.splitlines(True), key = str.isspace) : 
     if not group_separator : 
      yield ''.join(line_iteration) 

for p in paragraph('p1\n\t\np2\t\n\tstill p2\t \n  \n\tp'): 
    print repr(p) 

'p1\n' 
'p2\t\n\tstill p2\t \n' 
'\tp3' 

यह उत्पादन पट्टी के रूप में आप यह निश्चित रूप से की जरूरत है आप पर निर्भर है।

प्रसिद्ध "अजगर कुकबुक" ;-)

+0

साफ समाधान। 'Str_isspace' क्या है? –

+0

एक टाइपो :-) आपको str.isspace को पढ़ना चाहिए जो ऑब्जेक्ट स्ट्रिंग से एक विधि issस्थान() है। यह निर्धारित करने के लिए बुलाया जाएगा कि कुछ जगह है या नहीं, और उसके अनुसार ऑब्जेक्ट समूह करेगा। मैंने ठीक कर दिया। –

+0

बहुत बढ़िया, यह समझ में आता है - धन्यवाद :) –

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

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