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

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

新規登録して質問してみよう
ただいま回答率
85.46%
正規表現

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

Python

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

Q&A

解決済

5回答

1128閲覧

正規表現で、特定の文字列のある行の末尾だけを削除したい

ratera

総合スコア54

正規表現

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

Python

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

0グッド

1クリップ

投稿2020/05/15 22:17

前提・実現したいこと

「特定の文字列"( "を含んでいる行」の末尾の改行から、
特定の文字列"( "を含んでいない行」の最後
「末尾の改行」を削除する方法を知りたいです。

例えば以下のテキストを入力として、、

あああ( ほげ ) いいいいい( ほげ ) ううううううううううううううう えええええええ おおおお( ほげ ) かかかかかかかか

以下のテキストのように出力させたいです。

あああ( ほげ )いいいいい( ほげ )うううううううううううううううえええええええ おおおお( ほげ )かかかかかかかか

処理は次のようになると思うのですが、ロジックと正規表現で選択の仕方が難しく方法の検討がついていません。

あああ( ほげ ) いいいいい( ほげ ) ←削除する ううううううううううううううう←削除する えええええええ←削除する おおおお( ほげ )←"( "の無い行を過ぎて、"( "のある行に到着したので改行は削除しない かかかかかかかか←削除する

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

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

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

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

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

hope_mucci

2020/05/15 23:46

正規表現で解決しないとダメなのでしょうか?
ratera

2020/05/16 02:29

すみません。今確認しました。 そういうわけではないです!
guest

回答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

KojiDoi

総合スコア13671

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

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

ratera

2020/05/16 02:35

ありがとうございます! 色々と変えて、自分で理解できるように抑えていきたいと思います。
guest

0

正規表現1つの置換では難しいと思います。
マッチングと置換文字列を分けて考えるとやりやすいと思います。

  1. 正規表現で対象の文字列をマッチさせる。
  2. 置き換え文字列はマッチした文字列から改行を取り除いた文字列とする。

マッチさせる正規表現のイメージは以下のようになります。

( ( 改行が含まれず、全角"("が少なくとも1つ含まれる文字の並び ) の後に改行 ) … ① が1回以上の繰り返し の後に ( ( 改行も全角"("も含まれない文字の並びが1回以上 ) の後に改行 ) が1回以上の繰り返し … ② ① 例えば、以下のような書き方があります。 改行が含まれない文字の並びが0回以上 全角"(" 改行が含まれない文字の並びが0回以上 ② マッチが成功する最長の文字列である必要があります。

上記でマッチした文字列に対し、改行文字を空文字に置換したものを置換先文字列とします。

投稿2020/05/16 00:45

etsuhisa

総合スコア416

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

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

ratera

2020/05/16 02:32

ご丁寧にありがとうございます。 仰る通り、マッチングと置換を分けて考えると理解しやすいです。 ありがとうございます。
guest

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
mit0223

総合スコア3401

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

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

hope_mucci

2020/05/15 23:49

'【'なしの行が連続3行以上入ると想定と異なる結果が返ってくると思います。
mit0223

2020/05/16 00:27

hope_mucci様ご指摘ありがとうございました。修正しました。
ratera

2020/05/16 02:34

'【'にするとわかりやすいですね。 その発想にいたりませんでした、、、教えてくださりありがとうございます。
guest

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

etsuhisa

総合スコア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
katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問