テキスト処理スクリプト:パターン全体が一致する場合にのみ一連の行を削除します。

テキスト処理スクリプト:パターン全体が一致する場合にのみ一連の行を削除します。

パターン全体が一致する場合にのみ、行セットを(グローバルに)削除したいと思います。

スキーマの説明:

ライン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()))

おすすめ記事