문제

Python에서 단락을 분할하는 데 사용할 정규식을 어떻게 작성합니까?

단락은 2개의 줄 바꿈( )으로 정의됩니다.그러나 줄 바꿈과 함께 공백/탭을 얼마든지 가질 수 있으며 여전히 단락으로 간주되어야 합니다.

솔루션에서 Python을 사용할 수 있도록 Python을 사용하고 있습니다. 정규식 구문 확장된 것입니다.(이용할 수 있다 (?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에스.

도움이 되었습니까?

해결책

불행하게도 "공백은 있지만 개행은 아님"을 쓸 수 있는 좋은 방법은 없습니다.

내 생각엔 당신이 할 수 있는 최선은 x 수정자를 사용하여 추악한 부분을 조금 제외하려고 노력하지만 의심스럽습니다. (?x) (?: [ \t\r\f\v]*? \n ){2} [ \t\r\f\v]*?

문자 클래스에 대해서만 하위 규칙을 만들고 이를 세 번 보간해 볼 수도 있습니다.

다른 팁

일반 테스트에서 문서의 구조를 추론하려고 하시나요?당신은 무엇을하고 있습니까? 문서 하다?

간단히 다음을 사용할 수도 있습니다. Docutils 파서 스스로 굴리는 것보다.

정규 표현식은 아니지만 정말 우아합니다.

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'

물론 필요에 따라 출력을 제거하는 것은 사용자에게 달려 있습니다.

유명한 "Python Cookbook"에서 영감을 얻었습니다 ;-)

거의 동일하지만 탐욕스럽지 않은 수량자를 사용하고 공백 시퀀스를 활용합니다.

\s*?\n\s*?\n\s*?
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top