Giả sử tôi có một chuỗi như sau:biểu hiện thường xuyên để phù hợp với tên hàm và tất cả các đối số bằng Python
"func(arg1, arg2, arg3, arg4, ..., argn)"
EDIT: Chức năng này không có trong một số ngôn ngữ cụ thể. Nó chỉ có định dạng này. Nếu nó làm cho nó dễ dàng hơn, đừng nghĩ nó như một lời gọi hàm, chỉ là một chuỗi.
Tôi muốn viết cụm từ thông dụng để khớp với hàm và mỗi đối số. Tôi đang viết điều này bằng Python. Các đầu ra mong muốn của việc này là:
{"function" : "func", "arg" : ["arg1", "arg2", ... , "argn"]}
EDIT: Trong khi các đối số có thể là gọi hàm, tôi dễ dàng đệ quy có thể thử kết hợp chúng với các biểu hiện thường xuyên cùng một lần tôi có thể tạo ra loại phù hợp. Bởi điều này tôi có nghĩa là tôi có thể recurse trên chức năng với mỗi đối số. Nhưng điều này không thực sự có liên quan. Tôi là không phải cố gắng tạo một thông dịch viên, chỉ cần một cái gì đó để nhận ra các đối số.
Đây là nỗ lực của tôi lúc này:
import re
s = "func(arg1, arg2, arg3, arg4, argn)"
m = re.match(r"(?P<function>\w+)\s?\((?P<args>(?P<arg>\w+(,\s?)?)+)\)", s)
print m.groupdict()
Và đây là kết quả:
{'function': 'func', 'args': 'arg1, arg2, arg3, arg4, argn', 'arg': 'argn'}
Chức năng phù hợp tốt, và do đó, các thiết lập tham số. Tuy nhiên, tôi dường như không thể đối sánh với các đối số riêng lẻ. Đây có phải là một vấn đề với regex của tôi, hoặc một hạn chế của Python phù hợp với biểu thức chính quy?
EDIT2: Tôi biết rằng bây giờ tôi có thể chia nhỏ các đối số sử dụng đoạn mã sau:
d["arg"] = d["args"].split(", ")
Nhưng tôi đã tự hỏi nếu tôi có thể làm toàn bộ công việc với các biểu thức thông thường. Đặc biệt, tôi tự hỏi tại sao "arg" chỉ phù hợp với đối số cuối cùng.
EDIT3: Tôi đoán tôi (1) hy vọng tìm ra lý do tại sao Python chỉ khớp với đối số cuối cùng mọi lúc và (2) liệu tôi có thể thực hiện khớp mẫu kiểu lược đồ trong Python hay không. Hoặc nếu có một cái gì đó giống như trực quan trong Python như là mô hình kiểu lược đồ khớp. Tôi nhìn vào mô-đun ast, và cú pháp của nó là cực kỳ phức tạp.
Chức năng này có gọi bằng một số ngôn ngữ cụ thể không? Bạn không nên sử dụng cụm từ thông dụng để phân tích ngôn ngữ mà trình phân tích cú pháp chính xác/đầy đủ đã tồn tại ... – Borealid
Bạn không thể thực hiện điều này bằng các biểu thức chính quy (giả sử bạn muốn khớp với các đối số riêng lẻ).). Bạn cần một trình phân tích cú pháp thực tế. Nếu bạn nhấn mạnh vào viết của riêng bạn, sau đó đọc này: http://effbot.org/zone/simple-iterator-parser.htm – Wes
Bạn có thể muốn kiểm tra [pyparsing] (http://pyparsing.wikispaces.com/) nếu bạn đang có kế hoạch làm một cái gì đó phức tạp hơn. –