前提・実現したいこと
「特定の文字列"( "を含んでいる行」の末尾の改行から、
特定の文字列"( "を含んでいない行」の最後
「末尾の改行」を削除する方法を知りたいです。
例えば以下のテキストを入力として、、
あああ( ほげ ) いいいいい( ほげ ) ううううううううううううううう えええええええ おおおお( ほげ ) かかかかかかかか
以下のテキストのように出力させたいです。
あああ( ほげ )いいいいい( ほげ )うううううううううううううううえええええええ おおおお( ほげ )かかかかかかかか
処理は次のようになると思うのですが、ロジックと正規表現で選択の仕方が難しく方法の検討がついていません。
あああ( ほげ ) いいいいい( ほげ ) ←削除する ううううううううううううううう←削除する えええええええ←削除する おおおお( ほげ )←"( "の無い行を過ぎて、"( "のある行に到着したので改行は削除しない かかかかかかかか←削除する
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/16 02:29
回答5件
0
ベストアンサー
処理は次のようになると思う
この条件設定が微妙に的を外しているように見えます。
対象テキストを1行ずつ上から見ていくとして:
- 現在注目している行に全角開き括弧が含まれており、かつ、ひとつ前の行に全角開き括弧が含まれていないならば、改行を出力する。
- 上記の処理の後に当該行のテキストを出力する。
という感じではないでしょうか。
とりあえずこの認識に従って愚直にループを回して処理してみました。
(正規表現で処理できるかもしれませんが、このケースでは無駄にややこしすぎるように思います。)
#!/usr/bin/env python # -*- coding: utf-8 -*- import re testtxt = """あああ( ほげ ) いいいいい( ほげ ) ううううううううううううううう えええええええ おおおお( ほげ ) かかかかかかかか""" prev = "" for x in testtxt.split("\n"): if (re.search("^[^(]+$", prev) and re.search(r"(", x)): print("") print(x, end="") prev = x
投稿2020/05/16 00:02
総合スコア13692
0
正規表現1つの置換では難しいと思います。
マッチングと置換文字列を分けて考えるとやりやすいと思います。
- 正規表現で対象の文字列をマッチさせる。
- 置き換え文字列はマッチした文字列から改行を取り除いた文字列とする。
マッチさせる正規表現のイメージは以下のようになります。
( ( 改行が含まれず、全角"("が少なくとも1つ含まれる文字の並び ) の後に改行 ) … ① が1回以上の繰り返し の後に ( ( 改行も全角"("も含まれない文字の並びが1回以上 ) の後に改行 ) が1回以上の繰り返し … ② ① 例えば、以下のような書き方があります。 改行が含まれない文字の並びが0回以上 全角"(" 改行が含まれない文字の並びが0回以上 ② マッチが成功する最長の文字列である必要があります。
上記でマッチした文字列に対し、改行文字を空文字に置換したものを置換先文字列とします。
投稿2020/05/16 00:45
総合スコア416
0
こんな感じでしょうか?
python
1import re 2 3data = """あああ【 ほげ 】 4いいいいい【 ほげ 】 5ううううううううううううううう 6えええええええ 7おおおお【 ほげ 】 8かかかかかかかか""" 9 10print(re.sub(r'([^\n]*【[^\n]*)\n(([^【\n]+)\n([^【\n]+\n)|)',r'\1\3\4',data)) 11
テストデータのカッコ'('が全角だったので、正規表現がわかりやすいように'【'かえております。
投稿2020/05/15 23:06
編集2020/05/16 00:26総合スコア3401
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/15 23:49
2020/05/16 00:27
2020/05/16 02:34
0
正規表現でマッチさせ、replaceで改行を空文字に置き換えるコードは以下のようになります。
Python
1import re 2s = """あああ( ほげ ) 3いいいいい( ほげ ) 4ううううううううううううううう 5えええええええ 6おおおお( ほげ ) 7かかかかかかかか 8""" 9t = re.sub(r'(([^\n]*([^\n]*\n)+([^(]+\n)+)', lambda m: m.group().replace('\n',''), s, flags=re.DOTALL|re.MULTILINE) 10print(t)
投稿2020/05/16 06:15
総合スコア416
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
改行を削除するのではなく、改行を追加するといくようにかんがえてはどうでしょう?
以下のプログラムではファイル内容を全部よみこんで、"\n" d split して
改行を削除して行データを保持します。
そして、上の行の状態と今処理している行の状態をみて 改行を追加するか/しないか をきめています。
python3
1path = "a.txt" 2with open(path) as f: 3 data = f.read() 4 # print(data) 5# print() 6 7lines = data.split("\n") 8ans = [] 9prev_has_kakko = False 10for line in lines: 11 if line.find("(") < 0: 12 prev_has_kakko = False 13 else: 14 if not prev_has_kakko and len(ans) > 0: 15 ans.append("\n") 16 prev_has_kakko = True 17 ans.append(line) 18print("".join(ans))
投稿2020/05/16 02:57
編集2020/05/19 03:52総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。