Я программист Perl, который пытается изучить Python, выполнив некоторую работу, которую я сделал раньше, и преобразовал ее в Python. Это НЕ перевод строки за строкой. Я хочу изучить технику Python для выполнения этого типа задач.
Я разбираю файл 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?
Я проходил различные обучающие программы на линии, и они помогли мне понять синтаксис, но не так много, чтобы обрабатывать сам язык - особенно тот, кто склонен думать на другом языке.
Мой вопрос:
- Должен ли я использовать регулярные выражения? Или есть другой и лучший способ справиться с этим?
- Правильно ли моя логика кодирования? Как я должен думать о разборе этого файла?