Lucas Trzesniewski's comment thực sự có thể được sử dụng trong Python với PyPi regex module (tôi chỉ thay tên nhóm với một số để làm cho nó ngắn hơn):
>>> import regex
>>> r = regex.compile(r'({(?:[^{}]++|\g<1>)*})(*SKIP)(*FAIL)|\s*,\s*')
>>> s = """{J. Doe, R. Starr}, {Lorem
{i}psum dolor }, Dol. sit., am. et."""
>>> print(r.split(s))
['{J. Doe, R. Starr}', None, '{Lorem\n{i}psum dolor }', None, 'Dol. sit.', None, 'am. et.']
Các mô hình - ({(?:[^{}]++|\g<1>)*})(*SKIP)(*FAIL)
- phù hợp với {...{...{}...}...}
như cấu trúc (như {
trận {
, (?:[^{}]++|\g<1>)*
trận 0+ lần xuất hiện của 2 lựa chọn: 1) bất kỳ 1+ ký tự nào khác ngoài {
và }
(số [^{}]++
), 2) văn bản khớp với toàn bộ mô hình ({(?:[^{}]++|\g<1>)*})
). Động từ (*SKIP)(*FAIL)
làm cho động cơ bỏ qua toàn bộ giá trị khớp từ bộ đệm khớp, do đó, di chuyển chỉ mục đến cuối khớp và không giữ gì để trả về (chúng tôi "bỏ qua" những gì chúng tôi đã so khớp).
\s*,\s*
khớp với dấu phẩy được đính kèm với hơn 0 khoảng trắng.
Giá trị None
xuất hiện vì có nhóm chụp trong chi nhánh đầu tiên trống khi chi nhánh thứ hai khớp. Chúng ta cần sử dụng một nhóm chụp trong nhánh thay thế đầu tiên để đệ quy. Để xóa các phần tử trống, hãy sử dụng hiểu:
>>> print([x for x in r.split(s) if x])
['{J. Doe, R. Starr}', '{Lorem\n{i}psum dolor }', 'Dol. sit.', 'am. et.']
Nguồn
2016-03-31 08:00:58
AFAIK Python không hỗ trợ đệ quy trong regex. Chỉ để tham khảo, điều này sẽ [thực hiện công việc] (http://regex101.com/r/qD4zV8/1) với PCRE: '(? 'Niềng răng' \ {(?: [^ {}] ++ | \ g) * \}) (* SKIP) (* FAIL) |, ' –
đây không phải là điều nhỏ nhặt bạn yêu cầu ... ... regexes không hữu ích vì bạn yêu cầu máy trạng thái có bộ nhớ để khớp với các mục kèm theo. (brakcets, dấu ngoặc kép, vv) –
Nó không thể được thực hiện mà không có regex đệ quy (những người làm đệ quy). Tôi nghĩ rằng Python có một phiên bản mới hơn thực hiện điều này ngay bây giờ. Hài hước như thế nào Perl đến từ Python, Perl lá nó trong bụi. – sln