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

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

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

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

置換

置換とは文字列中の特定の文字に対して、別の文字列に置き換えることを指します。

Python

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

Q&A

解決済

4回答

1346閲覧

Python 文字列の置換

suvera

総合スコア106

正規表現

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

置換

置換とは文字列中の特定の文字に対して、別の文字列に置き換えることを指します。

Python

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

0グッド

0クリップ

投稿2018/01/30 06:16

前提・実現したいこと

python 2.7です。

文字列の置換を綺麗に行いたいです。
正規表現とかでもっときれいになるとは思うんですが思い浮かびません。

該当のソースコード

python

1file_name = "ABC01_de02_v00.txt" 2file_name, ext = os.path.splitext(file_name) 3split_name = file_name.split("_") 4file_name = "" 5for i in range(len(split_name)): 6 if i == len(split_name)-1: 7 file_name += "fix" 8 else: 9 file_name += split_name[i] + "_"

最終的にはfile_nameABC01_de02_endになるようにしたいです。
_v??のところを_endに置換したいです。
??のところはバージョンなので幾つになるかはわかりません。

ただ、ABC01_de02に必ず_v??が含まれることがないとは言い切れません。
例) uv01_wxyz などです。

replace()だと例の際に置換がかかる可能性があり上記のように処理しています。

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

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

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

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

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

guest

回答4

0

ただ、ABC01_de02に必ず_v??が含まれることがないとは言い切れません。

例) uv01_wxyz などです。

ちょっとここが理解できなかったのですが、勝手な解釈で_v00自体が含まれない場合もあるという事ですかね?

Python

1import os 2import re 3 4file_name = "ABC01_de02.txt" 5file_name, ext = os.path.splitext(file_name) 6 7check = re.search('(?<=_)v\d{2}', file_name) 8 9if check is None: 10 file_name += '_end' + ext 11else: 12 file_name = re.sub( 13 r'(?<=_)v\d{2}', r'end', 14 file_name 15 ) + ext 16 17print(file_name)

投稿2018/01/30 06:47

Yuki_S

総合スコア356

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

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

0

ベストアンサー

どの程度まで厳密に判定するか?によりますが、とりあえず。

Python

1import re 2for s in ['ok_v00.txt','ok_v1.txt','ng_v.txt','ng.txt']: 3 ret = re.sub(r'_v\d+', '_end', s) 4 print(ret)

投稿2018/01/30 06:34

can110

総合スコア38266

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

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

suvera

2018/01/30 07:31 編集

ありがとうございます!これだけでもかなりスッキリします。 後方から1つだけしか置換しないということはできますか? ng_v00ng_v00.txtのような名前にも対応できるようにしたいです。
can110

2018/01/30 07:34

".txt"の手前の"."も含めるように `ret = re.sub(r'_v\d+.', '_end.', s)` とすればひとまず対応できます。
suvera

2018/01/30 07:56

なるほど、ありがとうございます。 拡張しない場合は $ 入れればできそうです。 ありがとうございました!
guest

0

やりたいのはこういうことですかね?

python

1import re 2 3file_name = "ABC01_de02_v00.txt" 4file_name2 = re.sub("_v\d\d", "_end", file_name) 5print(file_name2) 6

投稿2018/01/30 06:28

KojiDoi

総合スコア13671

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

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

0

一応これならABC01_de02_v00.txtuv01_wxyz_v00.txtも置換できます。

Python

1import re 2 3file_name = 'ABC01_de02_v00.txt' 4file_name = re.sub( 5 r'(?<=_)v\d{2}(?=.txt)', r'end', 6 file_name 7) 8 9print file_name

Wandbox

投稿2018/01/30 06:28

編集2018/01/30 06:36
LouiS0616

総合スコア35660

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問