正規表現を使ってreplace処理を実現したいのですが、ご教授頂けないでしょうか。
修正前
Python
1def convert(tmp_file_path): 2 try: 3 with open(tmp_file_path, encoding='utf-8') as file: 4 insert_info = next(file) 5 data_lines = file.read() 6 # 文字列置換 7 data_lines = data_lines.replace(",,,,,,,,", "") 8
上記は
AAAA, BBB,,,,,,,,
というレコードを
AAAA, BBB
に置換する処理です。
これを下記にも対応できるようにしたいです。
※BBBのあと2カラム(CCCCとDDDDのところ)に任意の値が入ります。
AAAA, BBB,CCCC,DDDD,,,,,, や AAAA, BBB,1234,9876,,,,,, や AAAA, BBB,,ZZZZ,,,,,,
などのデータが来た時に
AAAA, BBB
に置換するようにしたいです。
追記
仕様の説明が不足していたため追記します。
任意の文字列1,任意の文字列2,任意の文字列3,,,,,,
というデータを
任意の文字列1
にしたいと考えています。
詳細な仕様の追記、ありがとうございます。
「任意の文字列1,任意の文字列2,任意の文字列3,,,,,,」というデータの出力結果については理解しましたが、
「任意の文字列1,任意の文字列2,任意の文字列3,,,,,,」というデータで *ない* 場合の出力結果はどうあるべきですか?
また、「任意の文字列1,任意の文字2,任意の文字列3,,,,,,」の「任意の文字列」とは 1文字以上ということですか? 0文字も含みますか? 任意の文字がカンマそのものであった場合はどうなりますか?
さらに入力データはカラム数 9 の CSV と見受けられますが、カラム数が多い、または少ない場合のパターンはどうなりますか?
はい、入力データはカラム数 9 の CSV になります。
「任意の文字列1,任意の文字列2,任意の文字列3,,,,,,」というデータで *ない* 場合の出力結果
⇒CSVには少なくとも1レコード以上のデータが存在する前提でお願い致します。
「任意の文字列」は0文字の可能性もあります。
任意の文字はカンマ以外とさせてください。
カラム数が多い少ないといったことも起きない想定でお願い致します。
例えば
AAA,BBB,CCC,DDD,,,,,
は
任意の文字列1,任意の文字列2,任意の文字列3,,,,,,
に合致しませんが (第4カラムに文字列が入っているため)、そのようなデータはないという前提でしょうか?
つまり、「任意の文字列1,任意の文字列2,任意の文字列3,,,,,,」の場合は理解しましたが、「そうでない場合」はありえない、と考えてよいかを確認したいです。
すみません。混乱してしまいました。
正確には
任意の文字列1,任意の文字列2,・・・・・,任意の文字列29,CCC,DDD,,,,,
を
任意の文字列1,任意の文字列2,・・・・・,任意の文字列29
としたい。というのが本当にやりたいことです。
任意の文字列1~29を任意の文字列1としてまとめて記載してしまっておりました。
任意の文字列30が"CCC"で、任意の文字列が"DDD"の場合、そのようにするという意味でしょうか。
あるいは
任意の文字列30と31の両方に1文字以上の任意文字列が入っている場合、そのようにするという意味でしょうか。
また、いずれの意味であっても、それに合致しない場合はどうするべきなのでしょうか。
任意の文字列1,任意の文字列2,・・・・・,任意の文字列29,任意の文字列30,任意の文字列31,,,,,
を
任意の文字列1,任意の文字列2,・・・・・,任意の文字列29
にしたいです。
つまり、 任意の文字列30と31の両方に1文字以上の任意文字列が入っている場合、そのようにするという意味ですね。
で、その条件に合致しない場合はどうするべきでしょうか。
そのようなケースはありえない? あるいはそのまま出力する?
任意の文字列30と31は0文字の場合もあり得ます。
条件に合致しない場合はありえない想定でお願いいたします。
> 任意の文字列30と31は0文字の場合もあり得ます。
となると、
任意の文字列1,任意の文字列2,・・・・・,任意の文字列29,,,,,,,
も条件に合致するので (0文字もありえるので)、
任意の文字列1,任意の文字列2,・・・・・,任意の文字列29
になってしまいますが、それでよいのでしょうか?
それはつまり「常に任意の文字列29 以降のカラムを削除する」と同じな気がしますが、正しいでしょうか?
説明が下手ですみません。
「常に任意の文字列29 以降のカラムを削除する」
であっています。
であれば、わたしが先日提示した
> print(columns[0] + ', ' + columns[1])
を
print(columns[0] + ',' + (略) + ',' + columns[28])
などとすれば OK です (0番目から 28番目までの 29個)。
他の皆様のコードも、数を変えたり増やしたりという点では同じです。
仕様が追記され、しかもココ(質問への追記依頼)を読むと、その仕様の記述が間違っている(実際には「常に任意の文字列29 以降のカラムを削除する」のですよね?)んですが、質問文の追記部分を修正してもらえませんかね。
元の質問に合わせるとすれば、「任意の文字列1,任意の文字列2」を残し、「常に任意の文字列3以降のカラムを削除する」になるのかな。
あと、「入力データでカンマの後に空白が入るのか入らないのか、どちらもあり得るのか」、「出力データではカンマの後に空白を付けるのか付けないのか」もはっきり記述してほしかった。
> 任意の文字列1~29を任意の文字列1としてまとめて記載してしまっておりました。
えっと、これで相手に通じると思っていたのかな。
回答4件
あなたの回答
tips
プレビュー