Tôi là một lập trình viên của Perl, những người đang cố gắng học Python bằng cách thực hiện một số công việc tôi đã thực hiện trước đó và chuyển đổi nó sang Python. Đây là NOT bản dịch từng dòng. Tôi muốn tìm hiểu kỹ thuật Python để thực hiện loại tác vụ này.Đường phân tích bằng Python: Sử dụng RE hay không?
Tôi đang phân tích tệp Windows INI. Tên các phần có định dạng:
[<type> <description>]
<type>
là một trường từ đơn và không phân biệt chữ hoa chữ thường. <description>
có thể là nhiều từ.
Sau một phần, có một loạt thông số và giá trị. Các hình thức này có dạng:
<parameter> = <value>
Thông số không có khoảng trắng và chỉ có thể chứa dấu gạch dưới, chữ cái và số (phân biệt chữ hoa chữ thường). Do đó, =
đầu tiên là dải phân cách giữa tham số và giá trị. Có thể có khoảng trắng tách thông số và giá trị quanh dấu bằng. Có thể có thêm khoảng trắng ở đầu hoặc cuối dòng.
Trong Perl, tôi đã sử dụng biểu thức thông thường để phân tích cú pháp:
while (my $line = <CONTROL_FILE>) {
chomp($line);
next if ($line =~ /^\s*[#;']/); #Comments start with "#", ";", or "'"
next if ($line =~ /^\s*$/); #Ignore blank lines
if ($line =~ /^\s*\[\s*(\w+)\s+(.*)/) { #Section
say "This is a '$1' section called '$2'";
}
elsif ($line =~ /^\s*(\w+)\s*=\s*(.*)/) { #Parameter
say "Parameter is '$1' with a value of '$2'";
}
else { #Not Comment, Section, or Parameter
say "Invalid line";
}
}
Vấn đề là tôi đã bị hỏng bởi Perl, vì vậy tôi nghĩ rằng cách dễ nhất để làm điều gì đó là sử dụng một biểu thức chính quy. Dưới đây là đoạn code tôi có cho đến nay ...
for line in file_handle:
line = line.strip
# Comment lines and blank lines
if line.find("#") == 1 \
or line.find(";") == 1 \
or line.whitespace:
continue
# Found a Section Heading
if line.find("[") == 1:
print "I want to use a regular expression here"
print "to split the section up into two pieces"
elif line.find("=") != -1:
print "I want to use a regular expression here"
print "to split the parameter into key and value"
else
print "Invalid Line"
Có một số điều mà kích thích tôi ở đây:
- Có hai nơi mà một biểu thức chính quy chỉ dường như được gọi ra để được sử dụng. Cách Python làm việc tách này là gì?
- Tôi đảm bảo tách khoảng trắng ở hai bên của chuỗi và viết lại chuỗi. Bằng cách đó, tôi không phải làm nhiều lần. Tuy nhiên, tôi đang viết lại chuỗi mà tôi hiểu là một hoạt động rất kém hiệu quả trong Python. Cách Python để xử lý vấn đề này là gì?
- Cuối cùng, thuật toán của tôi trông khá giống thuật toán Perl của tôi, và dường như nói rằng tôi đang để tư duy Perl của tôi cản trở. Mã của tôi nên được cấu trúc bằng Python như thế nào?
Tôi đã trải qua nhiều hướng dẫn khác nhau và họ đã giúp tôi hiểu cú pháp, nhưng không có nhiều cách xử lý ngôn ngữ - đặc biệt là người có xu hướng nghĩ khác ngôn ngữ.
Câu hỏi của tôi:
- Tôi có nên sử dụng biểu thức thông thường? Hoặc, có cách nào khác và tốt hơn để xử lý việc này không?
- Logic mã hóa của tôi có đúng không? Làm thế nào tôi nên suy nghĩ về phân tích cú pháp tập tin này?
Hãy chắc chắn xem qua mô-đun ['ConfigParser'] (http://docs.python.org/library/configparser.html). –
Trong Perl bạn không 'tham nhũng', bạn' ban phước ' – joaquin
@SvenMarnach - Cảm ơn bạn đã gợi ý, nhưng tôi đã thấy điều đó. Vấn đề là ConfigParser đặt đầu ra vào một từ điển, và tôi không thể đảm bảo thứ tự của các phần trong một từ điển thực sự quan trọng trong ứng dụng cụ thể này. Tôi đã có cùng một vấn đề với Perl với mô-đun [Config :: Ini] (http://search.cpan.org/~rjbs/Config-INI-0.019/lib/Config/INI.pm). Bên cạnh đó, điều này mang lại cho tôi một cơ hội để thực sự tìm hiểu các ins and outs của Python. –