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

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

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

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

Q&A

解決済

2回答

689閲覧

Python reモジュールの正規表現

yositigu

総合スコア17

Python

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

0グッド

0クリップ

投稿2021/05/11 09:59

編集2021/05/11 10:40

reモジュールを使って下記を正規表現したいのですが、ご教授ください。

あるcsvを読み込み。
1レコード10カラムのデータとします。
8カラム目以降は空白に置換したいです。
8カラム目移行は値がある場合とない場合が存在します。


1,2,3,4,5,6,7,8,9,10⇒1,2,3,4,5,6,7

1,2,3,4,5,6,7,,,⇒1,2,3,4,5,6,7

みたいな感じで置換したいと考えています。
数値以外の文字が入る場合もありますが、「,」は入りません。

下記で一括置換できないでしょうか。

ファイル一気に読込 with open(file_path) as file: data_lines = file.read() #1,2,3,4,5,6,7,8,9,10⇒1,2,3,4,5,6,7,8,9,10 #1,2,3,4,5,6,7,,,⇒1,2,3,4,5,6,7 data_lines = data_lines.replace(",,,", "") # 1,2,3,4,5,6,7,8,9,10 を 1,2,3,4,5,6,7にしたい。 data_lines = data_lines.replace("ここで何かしらの正規表現", "")

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

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

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

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

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

ppaul

2021/05/11 10:02

splitしてjoinすれば簡単ですが、なぜ正規表尾源でやりたいのですか?
yositigu

2021/05/11 10:22

上記方法も考えたのですが、1行ずつ処理をすると時間がかかってしまいました。 全レコード読み込んで、正規表現で一括置換できないか知りたい次第です。
TakaiY

2021/05/11 10:33

正規表現を使っても一括変換はできませんよ? 一括っぽくやりたいのであれば、 pandas のDataFrameで処理とかでしょうか。
yositigu

2021/05/11 10:40

質問を修正しました。このreplaceを使った方法で、できないでしょうか?
ppaul

2021/05/11 11:10

そういう理由なら、正規表現を知りたいという質問ではなく、置き換え処理を高速化したいという質問にした方が、良い回答が得られるでしょう。 全ファイルを読み込んでreplaceすると、Pythonの処理ロジックではメモリ割当てあたりがネックになるでしょうね。
guest

回答2

0

ベストアンサー

re.sub()を使って、複数行を一度に置換する場合は、flagsにre.MULTILINEをセットしたらよいです。

python

1import re 2 3txt = '''1,2,3,4,5,6,7,8,9,10 41,2,3,4,5,6,7,,,''' 5 6txt2 = re.sub(',[^,]*,[^,]*,[^,]*$', '', txt, flags=re.MULTILINE) 7# 下記の正規表現でもよいです。 8# txt2 = re.sub('(,[^,]*){3}$', '', txt, flags=re.MULTILINE) 9 10print(txt2) 11#1,2,3,4,5,6,7 12#1,2,3,4,5,6,7

投稿2021/05/11 11:36

編集2021/05/11 11:42
bsdfan

総合スコア4794

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

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

0

一応、これでも使えるでしょうか?

python

1>>> import re 2>>> 3>>> txt1 = "1,2,3,4,5,6,7,8,9,10" 4>>> txt2 = "1,2,3,4,5,6,7,,," 5>>> print(re.match(r"([^,]*,){6}[^,]*", txt1).group()) 61,2,3,4,5,6,7 7>>> print(re.match(r"([^,]*,){6}[^,]*", txt2).group()) 81,2,3,4,5,6,7

Pythonにこだわらないなら、awkが速いでしょう。

shell

1awk -F',' -v 'OFS=,' '{print $1,$2,$3,$4,$5,$6,$7}' in.csv >out.csv

投稿2021/05/11 10:20

編集2021/05/11 12:07
ppaul

総合スコア24670

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

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

yositigu

2021/05/11 10:26

ありがとうございます。 re関数がよくわかっておらず、恐縮ですが、 re.sub(正規表現、‘’, 全レコードデータの変数)を使う場合、どのようになりますか?
yositigu

2021/05/11 10:30

これだと、1行ずつ取り出さないといけなくなってしまい、処理時間がかかりそうな気がします。
ppaul

2021/05/11 12:05

気がするというのは、性能を考えるときにはあてになりません。 測定してみてください。 全部を読み込むことによる性能低下というのもあるのです。 Pythonにこだわらないなら。awkあたりを使った方が高速でしょう。 回答に追加しておきますので参考にしてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問