質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Sphinx

Sphinxは、reStructuredText記法で記述されたテキストファイルをHTML/PDF/epubといった様々な形式へ変換するドキュメントツールです。Pythonの公式ドキュメントを始め、多くのプロジェクトがSphinxを用いて記述されています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

2996閲覧

python3で特定の範囲の文字を抽出したい

TakamasaIijima

総合スコア16

Sphinx

Sphinxは、reStructuredText記法で記述されたテキストファイルをHTML/PDF/epubといった様々な形式へ変換するドキュメントツールです。Pythonの公式ドキュメントを始め、多くのプロジェクトがSphinxを用いて記述されています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

2クリップ

投稿2018/02/04 09:32

編集2018/02/04 09:34

前提・実現したいこと

python3とsphinxをつかってドキュメントを作っております。
以下のようなrstテキストにおいて特定の範囲を繰り返し抽出したいのですがうまく行く条件がわかりません。ご教授くださると幸いです。
将来的には抽出後の各配列から"タイトル名の同名.rst"に書き出すプログラムを書きたいです

rstの中身

============= sphinxタイトル ============= サブタイトルA #ここから ============= #なんとかかんとか #文字列 .. code-block:: python :lineos: python code #ここまで抽出したい サブタイトルB =========== ~~~~~~~ ~~~~~ サブタイトルC ===========

期待する出力

サブタイトルA #ここから ============= #なんとかかんとか #文字列 .. code-block:: python :lineos: python code #ここまで抽出したい

補足情報(FW/ツールのバージョンなど)

言語:python3

goma1661👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

python

1file_names = ['in-rst'] 2 3def extracts(data): 4 lnums = [i for i,l in enumerate(data) if l.startswith('======')] 5 title = data[0:lnums[1]+1] 6 results = [] 7 for i in range(2, len(lnums)-1): 8 results.append(''.join(data[lnums[i]-1:lnums[i+1]-2])) 9 results.append(''.join(data[lnums[-1]-1:])) 10 return title, results 11 12for file_name in file_names: 13 with open(file_name, 'r') as f: 14 data = f.readlines() 15 title, results = extracts(data) 16 print(title) 17 for item in results: 18 print('-'*50 + 'start') 19 print(item) 20 print('-'*50 + 'end')

in-rstの中身

============= sphinxタイトル ============= サブタイトルA #ここから ============= #なんとかかんとか #文字列 .. code-block:: python :lineos: python code #ここまで抽出したい サブタイトルB =========== ~~~~~~~ ~~~~~ サブタイトルC ===========

投稿2018/02/05 05:00

mkgrei

総合スコア8560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

test.txtを対象として、「サブタイトル」を含む行から「#ここまで抽出したい」を含む行までを出力するスクリプトを書いてみました。

追記。変数outfileに書き込み先ファイルを持たせるようにし、併せて出力が必要か否かのフラグの機能も持たせるようにしました。
流れとしては間違っていないと思いますが、細かいミスが残っているかもしれません。

python

1 2import re 3outfile = "" 4 5with open("test.txt", "r") as lines: 6 for line in lines: 7 line=line.rstrip('\r\n') 8 if outfile=="": 9 m = re.search("サブタイトル([A-Z]+)",line) 10 if m: 11 outfile = "out_{}.txt".format(m.group(1)) 12 fo = open(outfile, "w") 13 fo.write(line) 14 fo.write("\n") 15 else: 16 fo.write(line) 17 fo.write("\n") 18 m = re.match("#ここまで抽出したい",line) 19 if m: 20 fo.close() 21 outfile=""

投稿2018/02/04 10:29

編集2018/02/04 12:33
KojiDoi

総合スコア13669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TakamasaIijima

2018/02/04 11:31

KojiDoiさん  回答ありがとうございます。 参考にさせていただきます。 想定していました動作としましては、AからBまでだけではなくBからCまでもといったように一つのセクションづつをすべて取り出したいのですが,正規表現で=と文字列をうまく使って抽出できたりしますでしょうか..?
guest

0

自己解決

頂いた回答を元に元のrstを少しだけ改変して抽出することができました

rst

1============= 2sphinxタイトル 3============= 4 5§サブタイトルA #ここから->regex replace(Atom側で)で条件を(.+\W)(\n)(\W[==].*)として置換 6============= #置換先文字列を§$1$2$3としてタイトルの頭に§というマーカーを設置 7#なんとかかんとか 8#文字列 9.. code-block:: python 10 :lineos: 11 12 python code 13 14#ここまで抽出したい->ここを.*\n.*\n\nで発見させて#---というマーカーを設置 15 16#--- 17 18 19§サブタイトルB 20=========== 21~~~~~~~ 22~~~~~ 23 24#--- 25 26§サブタイトルC 27=========== 28...~

以下に抽出用プログラムのコードを記します

python

1 2import re 3import os.path 4 5base = os.path.dirname(os.path.abspath(__file__)) 6name = os.path.normpath(os.path.join(base, '../対象rstの名前.rst')) 7 8outfile = "" 9 10i = 0 11 12with open(name, "r", encoding="utf-8") as lines: 13 for line in lines: 14 line = line.rstrip('\n') 15 if outfile == "": 16 m = re.search("§", line) 17 if m: 18 i += 1 19 outfile = os.path.normpath(os.path.join(base, './result/'+str(i) + line + ".rst")) 20 print('sub/3/' +str(i) + line) 21 fo = open(outfile, "w", encoding="utf-8") 22 fo.write('sub/2/'+line) 23 fo.write("\n") 24 else: 25 fo.write(line) 26 fo.write("\n") 27 m = re.match("#-.*", line) 28 if m: 29 fo.close() 30 outfile = "" 31 32

コードについてアドバイスなどありましたらぜひご教授ください
回答ありがとうございました!
(WindowsのPycharmでopenがUTF-8じゃないのなんとかなんないですかね...Cpとかになっちゃう。。)

投稿2018/02/05 06:23

TakamasaIijima

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問