Câu hỏi này đã được hỏi và trả lời nhiều lần trước đây. Một số ví dụ: [1], [2]. Nhưng dường như không có gì chung chung hơn. Những gì tôi đang tìm kiếm là một cách để tách các chuỗi tại dấu phẩy không nằm trong dấu ngoặc kép hoặc cặp dấu tách. Ví dụ:Tách các chuỗi phân tách bằng dấu phẩy trong python
s1 = 'obj<1, 2, 3>, x(4, 5), "msg, with comma"'
nên được tách ra thành một danh sách ba yếu tố
['obj<1, 2, 3>', 'x(4, 5)', '"msg, with comma"']
Vấn đề bây giờ là điều này có thể trở nên phức tạp hơn vì chúng ta có thể nhìn vào cặp <>
và ()
.
s2 = 'obj<1, sub<6, 7>, 3>, x(4, y(8, 9), 5), "msg, with comma"'
mà nên được chia thành:
['obj<1, sub<6, 7>, 3>', 'x(4, y(8, 9), 5)', '"msg, with comma"']
Giải pháp ngây thơ mà không sử dụng regex là phải phân tích chuỗi bằng cách tìm kiếm các nhân vật ,<(
. Nếu tìm thấy <
hoặc (
thì chúng tôi bắt đầu tính tính chẵn lẻ. Chúng tôi chỉ có thể phân tách bằng dấu phẩy nếu số chẵn lẻ bằng 0. Ví dụ nói rằng chúng ta muốn chia s2
, chúng ta có thể bắt đầu với parity = 0
và khi chúng ta đạt s2[3]
chúng ta gặp phải <
mà sẽ tăng chẵn lẻ bằng 1. chẵn lẻ sẽ chỉ giảm khi nó gặp >
hoặc )
và nó sẽ tăng khi nó gặp <
hoặc (
. Trong khi tính chẵn lẻ không phải là 0, chúng ta có thể đơn giản bỏ qua dấu phẩy và không làm bất kỳ sự chia tách nào.
Câu hỏi ở đây là, có cách nào để nhanh chóng với regex này không? Tôi đã thực sự nhìn vào điều này solution nhưng điều này không có vẻ như nó bao gồm các ví dụ tôi đã đưa ra.
Một chức năng tổng quát hơn sẽ là một cái gì đó như thế này:
def split_at(text, delimiter, exceptions):
"""Split text at the specified delimiter if the delimiter is not
within the exceptions"""
Một số sử dụng sẽ là như thế này:
split_at('obj<1, 2, 3>, x(4, 5), "msg, with comma"', ',', [('<', '>'), ('(', ')'), ('"', '"')]
có regex có thể xử lý này hoặc là nó cần thiết để tạo ra một chuyên ngành phân tích cú pháp?
biểu thức thông thường sẽ không giúp bạn trong trường hợp này kể từ khi ngôn ngữ (tức là nhóm dây) bạn đang cố gắng phân tích cú pháp không phải là thường xuyên. Cho rằng bạn cho phép tùy ý lồng thẻ, không có cách nào dễ dàng để regex theo cách của bạn ra khỏi này. –
Regex không thể thực tế xử lý việc này và bạn sẽ không muốn nó. Độ phức tạp là tuyến tính ở mức tối thiểu, vì vậy bạn nhất thiết phải luôn có được hiệu suất tốt hơn với bộ kiểm tra chẵn lẻ. Bạn không phải tự mình xây dựng nó. Mô-đun 'csv' của Python thực hiện rất nhiều tác vụ. –
Argh, đừng nói rằng regex không thể xử lý nó! Có lẽ hương vị trăn không thể, nhưng những hương vị khác như PCRE có thể làm được! Đây là [một bằng chứng] (http://regex101.com/r/wU7lC9), chúng ta thậm chí có thể ưa thích và sử dụng các mẫu đệ quy để xem xét lồng nhau '<>()' – HamZa