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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

正規表現

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

Q&A

解決済

1回答

705閲覧

正規表現を用いた特定パターンの除外について

mako_H

総合スコア11

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

正規表現

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

0グッド

0クリップ

投稿2017/12/11 07:56

編集2017/12/11 09:15

###前提
PythonでJSONからCSV形式で抽出したファイルを読み込み、各行に対して正規表現を用いて整形するといった作業をしております。

たとえば、以下の様な行が複数あるとします。

Person(['Taro', 1, [], {'Sex': 'Male'}, 2001, {}]) Person(['Hanako', 2, [], {'Sex': 'Female'}, 2006, {}]) ...

このとき、

Python

1for row in reader: 2 newrow = [ 3 re.sub(re.compile("^[a-zA-Z]([^(]*)|[!-/-@[-`-~]"), '', item) 4 for item in row 5 ] 6 writer.writerow(newrow)

で記号及び先頭の文字列を取り除く処理を行っております。

###発生している問題
しかしこれを実行すると、

Taro, 1, , {Sex: Male}, 2001, {} Hanako, 2, , {Sex: Female}, 2006, {} ...

となり、元の行の<[]>の箇所が消えてしまいます。
正規表現を使い[]を含めた記号は消しつつ、<[]>と連続した箇所のみ消さないといったことは可能なのでしょうか?

拙い文章で申し訳ございません。
また、プログラムを勉強中の身でソースコード等見づらいかとも思いますが、回答いただければ幸いです。

###追記
検証に使用したソースコードとCSVファイルを載せておきます。

Python

1import re 2import csv 3 4# out2を開き編集したデータをout3に格納 5with open('out/out2.csv', 'r') as in_file: 6 with open('out/out3.csv', 'w') as out_file: 7 reader = csv.reader(in_file) 8 writer = csv.writer(out_file, lineterminator='\n') 9 10 for row in reader: 11 newrow = [ 12 re.sub(re.compile("^[\w]*(|)|\'"), '', item)[1:-1] 13 for item in row 14 ] 15 writer.writerow(newrow) 16

CSVファイル

Person(['Taro', 1, [], {'Sex': 'Male'}, 2001, {}]) Person(['Hanako', 2, [], {'Sex': 'Female'}, 2006, {}])

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

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

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

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

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

mit0223

2017/12/11 08:17

プログラムを同格家の前にもう少し入出力の仕様を厳格化する必要があります。JSON上は、文字列("true", "1")、数値(1)、boolean(true) は表記方法が異なりますが、CSVになった際は元の型の区別がつく必要はありませんか?あと、項目にJSON式が入っている場合、中にカンマが含まれている可能性があります(ex. {Sex:"Mail", Age:16})。この場合 CSV上ではどう出力されるべきですか?
mako_H

2017/12/11 09:27

ご指摘ありがとうございます。実はcsvにして使っているのは元のjsonデータを統計解析にかける為であり、その際csvが入力に用いられていた為採用しました。ご指摘を受けた2点については現時点で考えがついておりませんでした。どちらも検討したいと思います。
guest

回答1

0

ベストアンサー

そのフォーマットが必ず守られているのならば、
正規表現の部分で[]を除外せずに、
正規表現処理後に得られたものから[1:-1]の部分を抽出すれば目的は果たされます。


python

1import re 2a = "Person(['Taro', 1, [], {'Sex': 'Male'}, 2001, {}])" 3print(re.sub(re.compile("^[a-zA-Z]([^(]*)|[!-/-@[-`-~]"), '', a)) 4# -> Taro 1 {Sex: Male} 2001 {} 5print(re.sub(re.compile("^[\w]*(|)|\'"), '', a)[1:-1]) 6# -> Taro, 1, [], {Sex: Male}, 2001, {}

投稿2017/12/11 08:12

編集2017/12/11 08:22
mkgrei

総合スコア8560

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

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

mako_H

2017/12/11 09:19

回答ありがとうございます。 上記コードを実行したところ意図した結果が得られることは確認致しました。 そこで、コードを質問文に追記したように変更したのですが、出力されたCSVファイルの中身が以下のようになってしまいました。 Tar,,[,{Sex: Male,200,{} Hanak,,[,{Sex: Female,200,{} これはコードの記述が間違っているのでしょうか? 可能であれば回答いただければ幸いです。
mkgrei

2017/12/11 12:10

入力ファイルはcsvファイルではありません。 csvリーダーをやめて、 newrow = re.sub(re.compile("^[\w]*(|)|\'"), '', row)[1:-1] のようにすると良いのではないでしょうか。 文字列が得られているので、書き出しもcsvライターではうまくいかなさそうです。
mako_H

2017/12/13 14:39

遅くなりましたが、その方法で試してみたいと思います。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問