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

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

ただいまの
回答率

91.27%

  • Python 3.x

    2739questions

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

  • 正規表現

    606questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 81

mako_H

score 1

前提

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

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

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


このとき、

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


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

発生している問題

しかしこれを実行すると、

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


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

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

追記

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

import re
import csv

# out2を開き編集したデータをout3に格納
with open('out/out2.csv', 'r') as in_file:
    with open('out/out3.csv', 'w') as out_file:
        reader = csv.reader(in_file)
        writer = csv.writer(out_file, lineterminator='\n')

        for row in reader:
            newrow = [
                re.sub(re.compile("^[\w]*\(|\)|\'"), '', item)[1:-1]
                for item in row
            ]
            writer.writerow(newrow)


CSVファイル

Person(['Taro', 1, [], {'Sex': 'Male'}, 2001, {}])
Person(['Hanako', 2, [], {'Sex': 'Female'}, 2006, {}])
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • mit0223

    2017/12/11 17:17

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

    キャンセル

  • mako_H

    2017/12/11 18:27

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

    キャンセル

回答 1

checkベストアンサー

0

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


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/11 18:19

    回答ありがとうございます。
    上記コードを実行したところ意図した結果が得られることは確認致しました。
    そこで、コードを質問文に追記したように変更したのですが、出力されたCSVファイルの中身が以下のようになってしまいました。

    Tar,,[,{Sex: Male,200,{}
    Hanak,,[,{Sex: Female,200,{}

    これはコードの記述が間違っているのでしょうか?
    可能であれば回答いただければ幸いです。

    キャンセル

  • 2017/12/11 21:10

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

    キャンセル

  • 2017/12/13 23:39

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

    キャンセル

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

ただいまの回答率

91.27%

関連した質問

同じタグがついた質問を見る

  • Python 3.x

    2739questions

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

  • 正規表現

    606questions

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