理論的には素晴らしいが、実際にはひどい
CSV Iで説明したように規則を意味と仮定するつもりですRFC 4180。
基本的なCSVデータを照合するのは簡単ですが、
"data", "more data"
注:ところで、.split( '/ n')。split( '"')関数を使用すると、このような非常にシンプルで適切に構造化されたデータを使用する方がはるかに効率的です。正規表現はNDFSM(非決定性有限ステートマシン)は、エスケープ文字などのエッジケースの追加を開始すると、バックトラッキングに多くの時間を無駄にします。
たとえば、私が見つけた文字列に一致する最も包括的な正規表現は次のとおりです。
re_valid = r"""
# Validate a CSV string having single, double or un-quoted values.
^ # Anchor to start of string.
\s* # Allow whitespace before value.
(?: # Group for value alternatives.
'[^'\\]*(?:\\[\S\s][^'\\]*)*' # Either Single quoted string,
| "[^"\\]*(?:\\[\S\s][^"\\]*)*" # or Double quoted string,
| [^,'"\s\\]*(?:\s+[^,'"\s\\]+)* # or Non-comma, non-quote stuff.
) # End group of value alternatives.
\s* # Allow whitespace after value.
(?: # Zero or more additional values
, # Values separated by a comma.
\s* # Allow whitespace before value.
(?: # Group for value alternatives.
'[^'\\]*(?:\\[\S\s][^'\\]*)*' # Either Single quoted string,
| "[^"\\]*(?:\\[\S\s][^"\\]*)*" # or Double quoted string,
| [^,'"\s\\]*(?:\s+[^,'"\s\\]+)* # or Non-comma, non-quote stuff.
) # End group of value alternatives.
\s* # Allow whitespace after value.
)* # Zero or more additional values
$ # Anchor to end of string.
"""
単一引用符と二重引用符で囲まれた値を合理的に処理しますが、値の改行、エスケープされた引用符などは処理しません。
ソース:スタックオーバーフロー-JavaScriptで文字列を解析する方法
一般的なエッジケースが次のように導入されると、悪夢になります...
"such as ""escaped""","data"
"values that contain /n newline chars",""
"escaped, commas, like",",these"
"un-delimited data like", this
"","empty values"
"empty trailing values", // <- this is completely valid
// <- trailing newline, may or may not be included
改行としてのエッジケースだけで、野生で見つかったRegExベースのパーサーの99.9999%を破るのに十分です。唯一の「合理的な」代替手段は、高レベルの分析に使用されるステートマシンとペアになった基本制御/非制御文字(つまり、端末と非端末)のトークン化にRegExマッチングを使用することです。
出典:広範な痛みと苦痛として知られている経験。
私はjquery-CSVの著者であり、世界で唯一のJavaScriptベースで完全にRFCに準拠したCSVパーサーです。私は何ヶ月もこの問題に取り組み、多くの知的な人々と話し、コアパーサーエンジンの3つの完全な書き直しを含む異なる実装を試してみました。
tl; dr-話の教訓、PCREだけで、最も単純で厳密な通常の(Ie Type-III)文法以外の構文解析は得策ではありません。とはいえ、終端文字列と非終端文字列のトークン化には便利です。