Я программист на Perl, который пытается выучить Python, взяв некоторую работу, которую я делал ранее, и преобразовав ее в Python.Это НЕ построчный перевод.Я хочу научиться Python Technique выполнять задачи такого типа.
Я анализирую INI-файл Windows.Названия разделов имеют формат:
[<type> <description>]
* <type>
- это поле из одного слова, без учета регистра.<description>
может быть несколькими словами.
После раздела есть набор параметров и значений.Они имеют вид:
<parameter> = <value>
Параметры не имеют пробелов и могут содержать только подчеркивания, буквы и цифры (без учета регистра).Таким образом, первый =
является разделителем между параметром и значением.Может быть пробел, разделяющий параметр и значение вокруг знака равенства.В начале или конце строки могут быть лишние пробелы.
В Perl я использовал регулярные выражения для разбора:
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";
}
}
Проблема в том, что я был поврежденPerl, так что я думаю, что самый простой способ сделать что-то - это использовать регулярное выражение.Вот код, который у меня есть до сих пор ...
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"
Есть несколько вещей, которые меня здесь раздражают:
- Есть два места, где регулярное выражение просто кажется вызывающимдля использования.Как Python делает это разделение?
- Я убираю пробелы с обеих сторон строки и перезаписываю строку.Таким образом, мне не нужно делать зачистку несколько раз.Тем не менее, я переписываю строку, которая, как я понимаю, является очень неэффективной операцией в Python.Как Python решает эту проблему?
- В конце концов, мой алгоритм во многом похож на мой алгоритм Perl, и это, похоже, говорит о том, что я позволяю своему Perl-мышлению мешать.Как мой код должен быть структурирован в Python?
Я изучал различные интерактивные учебные пособия, и они помогли мне понять синтаксис, но не так много, как справиться ссам язык - особенно тот, кто склонен думать на другом языке.
Мой вопрос:
- Должен ли я использовать регулярные выражения?Или есть другой и лучший способ справиться с этим?
- Правильна ли моя логика кодирования?Как я должен думать о разборе этого файла?