Đẹp về lý thuyết, kinh khủng trong thực tế
Theo CSV tôi sẽ giả sử bạn có nghĩa là quy ước như được mô tả trong RFC 4180 .
Mặc dù khớp dữ liệu CSV cơ bản là không đáng kể:
"data", "more data"
Lưu ý: BTW, sử dụng hàm .split ('/ n'). Split ('"') hiệu quả hơn cho dữ liệu rất đơn giản và có cấu trúc tốt như thế này. Biểu thức chính quy hoạt động như một NDFSM (Không xác định hữu hạn Máy trạng thái) gây lãng phí rất nhiều thời gian quay lại một khi bạn bắt đầu thêm các trường hợp cạnh như ký tự thoát.
Ví dụ: đây là chuỗi kết hợp biểu thức chính quy toàn diện nhất mà tôi đã tìm thấy:
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.
"""
Nó xử lý hợp lý các giá trị được trích dẫn đơn và kép, nhưng không phải là dòng mới trong các giá trị, dấu ngoặc kép đã thoát, v.v.
Nguồn: Stack Overflow - Làm cách nào tôi có thể phân tích chuỗi bằng JavaScript
Nó trở thành một cơn ác mộng một khi các trường hợp cạnh phổ biến được giới thiệu như ...
"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
Chỉ riêng trường hợp cạnh giá trị dòng mới là đủ để phá vỡ 99.9999% trình phân tích cú pháp dựa trên RegEx được tìm thấy trong tự nhiên. Cách thay thế 'hợp lý' duy nhất là sử dụng kết hợp RegEx cho mã thông báo điều khiển / không điều khiển cơ bản (nghĩa là đầu cuối so với đầu cuối không đầu cuối) được ghép nối với một máy trạng thái được sử dụng để phân tích cấp cao hơn.
Nguồn: Kinh nghiệm còn được gọi là đau khổ và đau khổ.
Tôi là tác giả của jquery-CSV , trình phân tích cú pháp CSV dựa trên javascript, hoàn toàn tuân thủ RFC trên thế giới. Tôi đã dành nhiều tháng để giải quyết vấn đề này, nói chuyện với nhiều người thông minh và thử một tấn nếu các triển khai khác nhau bao gồm 3 bản viết lại đầy đủ của công cụ phân tích cú pháp lõi.
tl; dr - Đạo đức của câu chuyện, PCRE một mình hút để phân tích bất cứ điều gì ngoại trừ các ngữ pháp thông thường (Ie Type-III) đơn giản và nghiêm ngặt nhất. Mặc dù, nó hữu ích cho việc token hóa chuỗi đầu cuối và chuỗi không đầu cuối.