PostgreSQL cho phép tạo chỉ mục trên biểu thức, ví dụ: CREATE INDEX ON films ((lower(title)))
. Nó cũng có chức năng thông tin pg_get_expr()
chuyển định dạng nội dung của biểu thức thành văn bản, tức là, lower(title)
trong ví dụ trước. Các biểu thức có thể nhận được khá lông ở lần. Dưới đây là một số ví dụ (bằng Python):Tách danh sách các biểu thức hàm lồng nhau trong Python
sample_exprs = [
'lower(c2)',
'lower(c2), lower(c3)',
"btrim(c3, 'x'::text), lower(c2)",
"date_part('month'::text, dt), date_part('day'::text, dt)",
'"substring"(c2, "position"(c2, \'_begin\'::text)), "substring"(c2, "position"(c2, \'_end\'::text))',
"(((c2)::text || ', '::text) || c3), ((c3 || ' '::text) || (c2)::text)",
'f1(f2(arga, f3()), arg1), f4(arg2, f5(argb, argc)), f6(arg3)']
Mục cuối cùng không thực sự từ Postgres nhưng chỉ là một ví dụ cực kỳ về mã của tôi nên xử lý.
Tôi đã viết một hàm Python để phân tách các danh sách văn bản thành các biểu thức thành phần. Ví dụ, chi tiết cuối cùng được chia thành:
f1(f2(arga, f3()), arg1)
f4(arg2, f5(argb, argc))
f6(arg3)
tôi đã thử nghiệm với str
phương pháp như find()
và count()
và cũng coi regexes, nhưng cuối cùng tôi đã viết một chức năng đó là những gì tôi đã viết bằng C (về cơ bản đếm mở và đóng parens để tìm nơi để phá vỡ các văn bản). Đây là hàm:
def split_exprs(idx_exprs):
keyexprs = []
nopen = nclose = beg = curr = 0
for c in idx_exprs:
curr += 1
if c == '(':
nopen += 1
elif c == ')':
nclose += 1
if nopen > 0 and nopen == nclose:
if idx_exprs[beg] == ',':
beg += 1
if idx_exprs[beg] == ' ':
beg += 1
keyexprs.append(idx_exprs[beg:curr])
beg = curr
nopen = nclose = 0
return keyexprs
Câu hỏi đặt ra là liệu có cách nào hay hơn để sử dụng regexes để giải quyết vấn đề này.
Có một cái nhìn tại [ pyparsing] (http://pyparsing.wikispaces.com/) cho một số cảm hứng –
Regexes có thể không có bất cứ điều gì thanh lịch. Xem: http://perldoc.perl.org/perlfaq6.html#Can-I-use-Perl-regular-expressions-to-match-balanced-text%3f – Himanshu
Có, tôi đã tin rằng các regex không thể được sử dụng vì các máy trạng thái không thể đếm số lồng của các dấu ngoặc đơn mà không có sự trợ giúp của một chồng, ví dụ, một PDA là cần thiết. –