2014-01-06 62 views
3

我解析這個line -解析此字符串的Pythonic方式?

0386   ; Greek # L&  GREEK CAPITAL LETTER ALPHA WITH TONOS 

基本上,我需要 -

point = 0386 
script = Greek 

而我做這個樣子,

point = line.split(";")[0].replace(" ","") 
script = line.split("#")[0].split(";")[1].replace(" ","") 

我不相信我正在做的是做這件事最pythonic的方式,是否有一個更優雅的方式做到這一點?也許是一個正則表達式?

回答

2

使用map與不受約束的方法str.strip

>>> line = '0386  ; Greek # L& GREEK CAPITAL LETTER ALPHA WITH TONOS' 
>>> point, script = map(str.strip, line.split('#')[0].split(';')) 
>>> point 
'0386' 
>>> script 
'Greek' 

使用列表理解:

>>> point, script = [word.strip() for word in line.split('#')[0].split(';')] 
>>> point 
'0386' 
>>> script 
'Greek' 
+1

這看起來很簡潔,但我更喜歡不使用'map'。 –

+0

@GamesBrainiac,我添加了列表理解版本。 – falsetru

+0

@GamesBrainiac爲什麼不是'map'?它會如何影響性能? – ComputerFellow

0

這是我會怎麼做了吧:

>>> s = "0386   ; Greek # L&  GREEK CAPITAL LETTER ALPHA WITH TONOS" 
>>> point = s.split(';')[0].strip() 
>>> point 
'0386' 
>>> script = s.split(';')[1].split('#')[0].strip() 
>>> script 
'Greek' 

請注意,您可以重新使用s.split(';')。因此,也許它保存到var將是一個不錯的主意:

>>> var = s.split(';') 
>>> point = var[0].strip() # Strip gets rid of all the whitespace 
>>> point 
'0386' 
>>> script = var[1].split('#')[0].strip() 
>>> script 
'Greek' 
+1

原因downvote? –

3

如果你想有一個正則表達式一個班輪:

point, script = re.search("^(\d+)\s*;\s*(\S+)\s*.*$",s).groups() 

其中s是你的字符串,當然你需要import re

+0

+1 nothing like good ol正規表達式:) –

+0

'(「^(。*)\ s +; \ s +(。*)\ s +#。* $」,s).groups()'爲我工作。以上沒有。 – ComputerFellow

+1

@ComputerFellow,你的正則表達式匹配後面的空格。但如果它適合你,我很高興!無論如何,這裏的要點是要展示如何用一條正則表達式來處理它。 – EyalAr

3
>>> code, desc = line[:line.rfind('#')].split(';') 
>>> code.strip() 
'0386' 
>>> desc.strip() 
'Greek' 
+0

現在_this_是優雅的。布爾漢,你有我的投票! :d –