我是一名Perl程序員,他嘗試通過完成我之前完成的一些工作來學習Python,並將其轉換爲Python。這是不是一行一行的翻譯。我想學習Python技術來完成這種類型的任務。在Python中解析行:使用RE還是不行?
我正在解析Windows INI文件。部分名的格式爲:
[<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中構造?
我一直在閱讀各種在線教程,他們幫助我理解語法,但在處理語言本身方面卻沒有太多 - 尤其是那些傾向於在另一種語言中思考的人語言。
我的問題:
- 我應該使用正則表達式?或者,還有另一種更好的方法來處理這個問題嗎?
- 我的編碼邏輯是否正確?我應該如何考慮解析這個文件?
請務必查看['ConfigParser'](http://docs.python.org/library/configparser.html)模塊。 – 2012-02-08 21:33:30
在Perl中你不會'腐敗',你'保佑' – joaquin 2012-02-08 21:48:10
@SvenMarnach - 謝謝你的建議,但我已經看到了。問題在於ConfigParser將輸出放到字典中,我不能保證字典中的部分的順序在這個特定的應用程序中非常重要。我用[Config :: Ini](http://search.cpan.org/~rjbs/Config-INI-0.019/lib/Config/INI.pm)模塊對Perl有同樣的問題。此外,這讓我有機會真正瞭解Python的來龍去脈。 – 2012-02-08 21:55:42