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

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

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

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

Q&A

解決済

2回答

5062閲覧

「カンマで区切られた文字列をリスト化する、ただし""で囲まれた文字に含まれるカンマは区切り文字としては使用しない」としたときの解決方法について

mayonezudaiou

総合スコア2

Python

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

0グッド

2クリップ

投稿2020/09/28 05:08

Pythonのコード上で、以下の文字列をリスト化しようと考えています

Python

1string = '"あいうえお, かきくけこ", "さしすせそ", aaaaa, "bbbbb, ccccc", ddddd, "たちつてと, eeeee", fffff, "わをん, xyz"'

当初はsplit(",")を試みましたが、その場合、""で囲まれた箇所のカンマ(例:"あいうえお, かきくけこ")も対象になってしまいます。
次にsplit("",")を試しましたが、その場合は、""で囲まれていない箇所のカンマ(例:aaaaa)が対象外になってしまいます。

あくまでも""で囲まれた範囲内のカンマは無視して、それ以外のカンマで区切ってリスト化したいと考えております。
最終的には、以下のようなリストを考えています。

Python

1list = [ 2 "あいうえお, かきくけこ", 3 "さしすせそ", 4 "aaaaa", 5 "bbbbb, ccccc", 6 "ddddd", 7 "たちつてと, eeeee", 8 "fffff", 9 "わをん, xyz" 10]

何か良い方法はありますでしょうか?

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

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

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

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

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

kay-ws

2020/09/28 06:27

面白そうなのでやってみましたが 標準ライブラリのCSVモジュールでは望みの結果がでませんでした。 import csv str = '"あいうえお, かきくけこ", "さしすせそ", aaaaa, "bbbbb, ccccc", ddddd, "たちつてと, eeeee", fffff, "わをん, xyz"' for row in csv.reader([str]): for cell in row: print(cell) --- 結果 あいうえお, かきくけこ "さしすせそ" aaaaa "bbbbb ccccc" ddddd "たちつてと eeeee" fffff "わをん xyz" あいうえお, かきくけこだけうまくできているですね。よくわからないです。
meg_

2020/09/28 07:20

> 当初はsplit(",")を試みましたが、 > 次にsplit("\",")を試しましたが、 単純な処理では無理です。文字列処理のみでやりたいならもっと工夫が必要です。
bsdfan

2020/09/28 07:22

csvの仕様では、フィールド全体をダブルクォートで囲む必要があるので、今回の例文だとカンマの直後にスペースがあるため、ダブルクォートで囲まれている範囲を一つのフィールドと扱っていないのではないでしょうか。
mayonezudaiou

2020/09/28 09:36

コメントありがとうございます。 他の方の回答にもありましたが、CSV, StringIO, skipinitialspace=Trueを使用することでうまくいきました
guest

回答2

0

ベストアンサー

ええと、区切り文字の後の空白はpandasに処理させることができます(skipinitialspace=True)。

Python

1import pandas as pd 2import io 3 4string = '"あいうえお, かきくけこ", "さしすせそ", aaaaa, "bbbbb, ccccc", ddddd, "たちつてと, eeeee", fffff, "わをん, xyz"' 5 6result = pd.read_csv(io.StringIO(string), header=None, skipinitialspace=True).values[0].tolist() 7print(result)

result

1['あいうえお, かきくけこ', 'さしすせそ', 'aaaaa', 'bbbbb, ccccc', 'ddddd', 'たちつてと, eeeee', 'fffff', 'わをん, xyz']

投稿2020/09/28 07:35

Daregada

総合スコア11990

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

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

mayonezudaiou

2020/09/28 09:37

回答ありがとうございました。skipinitialspace=Trueがキーだったようで、うまくいきました
guest

0

pandasを使った変換方法です。
区切り文字の前後に半角スペースがあると正しくダブルクォーテーションによる引用符を判定できないため、
それを除去してからread_csvで読み込みリストに変換します。
ダブルクォーテーションに囲まれた文字間の区切り文字の半角スペースを除去しないようにするため、
正規表現置換でやや手こずり、二回かけて変換しています。

python

1import pandas as pd 2from io import StringIO 3import re 4 5s = '"あいうえお, かきくけこ", "さしすせそ", aaaaa, "bbbbb, ccccc", ddddd, "たちつてと, eeeee", fffff, "わをん, xyz"' 6s = re.sub(r'("[^"]+",) ', r'\1', s) 7s = re.sub(r'((?<!["&\w])[^"]+(?!["&\w]),) ', r'\1', s) 8li = pd.read_csv(StringIO(s), header=None).T.values.tolist() 9 10print(li) 11# [['あいうえお, かきくけこ'], ['さしすせそ'], ['aaaaa'], ['bbbbb, ccccc'], ['ddddd'], ['たちつてと, eeeee'], ['fffff'], ['わをん, xyz']]

投稿2020/09/28 06:51

yureighost

総合スコア2183

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

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

mayonezudaiou

2020/09/28 09:38

回答ありがとうございました。正規表現を使った置換は私も毎回苦戦してます。 今回提示いただいた正規表現も(少し時間はかかりますが)自分の中で消化して理解しようと思います。 また、pandasは今まで使用してなかったので、これを機に少し調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問