텍스트 처리 스크립트: 전체 패턴이 일치하는 경우에만 일련의 줄을 삭제합니다.

텍스트 처리 스크립트: 전체 패턴이 일치하는 경우에만 일련의 줄을 삭제합니다.

전체 패턴이 일치하는 경우에만 행 집합을 (전역적으로) 삭제하고 싶습니다.

스키마 설명:

라인 1:^[#]+ .*

2호선:^[[:space:]]*$

3행:^-[[:space:]]*$

4행:^[[:space:]]*$

5행:^[#]+ .*$|^[-]+[[:space:]]*$

노트:

  1. 3행 뒤에 공백이 있을 수 있습니다.-
  2. Line2 및 Line4에는 공백 문자가 있을 수 있거나 비어 있어야 합니다.
  3. 5번째 줄, 일치 ^[#]+ .*$또는^[-]+[[:space:]]*$
  4. Line5패턴 설명의 마지막 줄인 패턴의 마지막 줄을 삭제하고 싶지 않습니다 .

:

# Body

- Inside Body

# Summary

-

# Bibliography

- Read this book

예상 출력:

# Body

- Inside Body

# Bibliography

- Read this book

노트: 제공된 솔루션이 작동합니다. 다음과 같이 더 명확하게 작성할 수 있습니까?

e = '(^|\n)[#]+ .*\
    \n[\t ]*\
    \n-[\t ]*\
    \n[\t ]*\
    \n([#]+ .*|[-]+[\t ]*)\n'

또한 여러 줄 패턴이 여러 번 발생하는 경우 제공된 솔루션을 어떻게 해결할 수 있습니까?

답변1

Python 솔루션은 Python2 또는 3에서 작동해야 합니다. stdin에서 읽고 stdout으로 출력합니다. 내가 한 유일한 일은 [[:space:]]의 표현을 로 바꾸는 것이었습니다 [\t ].

#!/usr/bin/python3

import sys
import re
e='(^|\n)[#]+ .*\n[\t ]*\n-[\t ]*\n[\t ]*\n([#]+ .*|[-]+[\t ]*)\n'
print(re.sub(e, '\\1\\2\n', sys.stdin.read()))

관련 정보