Python:文字列を分割し、引用符を尊重して保持する[複製]

Python: Split a string, respect and preserve quotes [duplicate]


質問 written by Remo @2013-05-23 09:21:36Z

: 13 : 2 : 9

この質問にはすでに答えがあります:

Pythonを使用して、次の文字列を分割します。

a=foo, b=bar, c="foo, bar", d=false, e="false"

これにより、次のリストが表示されます。

['a=foo', 'b=bar', 'c="foo, bar"', 'd=false', 'e="false'"']

shlexをposixモードで使用し、「、」で分割する場合、 cの引数は正しく処理されます。 ただし、引用符は削除されます。 たとえば、 "false""false"と同じではないため、必要です。

これまでの私のコード:

import shlex

mystring = 'a=foo, b=bar, c="foo, bar", d=false, e="false"'

splitter = shlex.shlex(mystring, posix=True)
splitter.whitespace += ','
splitter.whitespace_split = True
print list(splitter) # ['a=foo', 'b=bar', 'c=foo, bar', 'd=false', 'e=false']
コメント 1

引用符の中に(エスケープされた)引用符がありますか?

written by ジャンヌカリラ @2013-05-23 09:26:30Z

コメント 2

はい、できます(バックスラッシュでエスケープします)。

written by レモ @2013-05-23 09:32:29Z

コメント 3

これはstackoverflow.com/a/79985/1540600の複製であり、優れた答えを提供していると思います。shlex.split()使用します。)

written by sferencik @2015-12-02 12:28:33Z

コメント 4

shlex.splitを指定できないため、これは複製ではありません。

written by RNA @2016-02-22 20:27:45Z

コメント 5

RNAに同意します。カスタム区切り文字の使用については、 stackoverflow.com参照してください

written by questions / 56791723 /…を @2019-06-29 11:41:15Z

回答 1 written by ジャンヌ・カリラ @2016-10-04 09:31:49Z
23
>>> s = r'a=foo, b=bar, c="foo, bar", d=false, e="false", f="foo\", bar"'
>>> re.findall(r'(?:[^\s,"]|"(?:\\.|[^"])*")+', s)
['a=foo', 'b=bar', 'c="foo, bar"', 'd=false', 'e="false"', 'f="foo\\", bar"']
  1. 正規表現パターン"[^"]*" 、単純な引用符付き文字列に一致します。
  2. "(?:\\.|[^"])*" 、引用符付き文字列と一致し、 \\.はバックスラッシュと任意の文字の2文字を消費するため、エスケープされた引用符をスキップします。
  3. [^\s,"]区切り文字以外と一致します。
  4. (?: | )+内でパターン2とパターン3を組み合わせると、区切り文字と引用符で囲まれた文字列のシーケンスと一致します。これは望ましい結果です。
コメント 1

ありがとう、魅力のように動作します!

written by レモ @2013-05-23 09:57:01Z

コメント 2

それがどのように機能するかを説明し、私は賛成票を投じます

written by ジェイソンS @2015-10-06 19:38:42Z

コメント 3

@JasonS同意しますが、 regex101.comには役立つ役立つ説明セクションがあります。例: i.imgur.com/SJMAQPI.png-blah238 16

written by @2016-10-03 22:08:49Z

コメント 4

それは便利ですが、それはポイントではありません。ポイントは、適切な答えがなぜそれが機能するのかを説明するということです。

written by ジェイソンS @2016-10-04 02:14:26Z

コメント 5

@JasonSいくつかの説明を追加しました。

written by ジャンヌカリラ @2016-10-04 12:57:13Z

回答 2 written by ydaetskcoR @2013-05-23 09:57:46Z
0

Regexはこれを簡単に十分に解決できます。

import re

mystring = 'a=foo, b=bar, c="foo, bar", d=false, e="false"'

splitString = re.split(',?\s(?=\w+=)',mystring)

ここでの正規表現パターンは、空白文字の後に単語文字が続き、次に等号を探します。これは、必要に応じて文字列を分割し、引用符を維持します。

コメント 1

これにより、 'c="foo, bar="'が分割され'c="foo, bar="'

written by -Janne Karila @2013-05-23 10:04:19Z

コメント 2

公正なポイント。私はそれが正規表現の問題だと思います。明示的でないものを書くといつも予期しないケースであなたをキャッチするように見えますが、明示的な正規表現は何が起こっているのかを読んで理解するのが恐ろしく見えるかもしれません。

written by ydaetskcoR @2013-05-23 10:07:09Z