2009-11-11 24 views
3

在Python:我怎麼說:在Python:我怎麼說:如果line.partition(「#」或「標籤」)......做一些

line = line.partition('#' or 'tab')[0] ... do something with 

我知道我可以這樣做:

line = line.partition('#')[0] ... do something 

但是什麼是製表符的代碼,我可以說#或製表符?

更新:我想說讀每行的第一個單詞,如果您閱讀#然後忽略該字符後的所有內容(因爲它是一個評論)。但後來我發現如果我在文件的第一個單詞標籤#中,那麼它會讀取標籤作爲第一個單詞的一部分。所以我試圖說,如果你閱讀一個標籤或一個散列,然後將該行作爲評論。解決辦法是在第一個單詞後面放一個空格,而不是製表符。但它不是很優雅。我現在意識到if語句是不正確的,我試圖簡化太多東西。上面現在是正確的,但我認爲內德巴切爾德的方式是現在走的路,但也許現在還有別的東西,你知道我想要做什麼。

+4

分區總是返回的3項的元組,所以你如果總是爲真 – 2009-11-11 01:14:47

+1

這是一個奇怪的問題,因爲string.partition()返回的第一部分,分隔符和第二部分的3元組。你不會在if語句中使用它。更可能存儲結果,然後檢查是否returnvalue [1] =='' – 2009-11-11 01:18:21

+0

你想做什麼?這段代碼不明智。 – 2009-11-11 03:24:07

回答

2

由於評論是從#到行尾,我們通常做的是這樣的。

raw_data, _, _ = line.partition("#") 
data= raw_data.strip() 
if len(data) == 0: 
    continue # or whatever, the data part of the line is empty 
# you have data 

問題的關鍵是不要試圖將註釋處理與空格刪除相結合。

[raw_data, _, _ = line.partition("#")將在raw_data的「#」之前保存部分,它會將「#」保存在名爲_的變量中。它也將在名爲_的變量中的「#」之後保存該部分。我們只是要忽略名爲_的變量,所以我們不關心重視它了。]

你也可以做到這一點

data, _, _ = line.strip().partition("#") 

這不是一般的解決方案,因爲有時這評論前的空白是有意義的。

+0

'len(data)== 0'? – SilentGhost 2009-11-11 11:16:23

+0

@SilentGhost:我解釋'如果不是數據:'以及零長度字符串等於'False'的事實太麻煩了。它導致了太多錯誤的思維。當人們尋找其他方式來精煉Python類型的特有功能時,人們眼中出現了奇怪的閃爍。嘆。 – 2009-11-11 11:45:07

+0

謝謝S.lott,但是raw_data,_,_是做什麼的? – John 2009-11-11 20:15:30

10

分區不允許的選項,所以你可能需要re.split

re.split("(#|\t)", line, 1) 

re.split有有趣的屬性,如果該模式被封閉在括號,然後將分離器在返回的結果,而你可以使用maxsplit(正如我在這裏設置爲1)。這將返回一個類似於分區的三元組。

但你要測試的分區,這始終是真正的返回值,所以我不知道你想什麼acheive ...

+1

我不知道,當在括號中圍繞正則表達式將返回拆分分隔符。每天學習一些東西。 +1 – MitMaro 2009-11-11 01:17:07

+0

這很不錯。如果未找到sep,行爲與分區略有不同。 – 2009-11-11 01:20:44

2

'\t'是包含標籤的字符串。

import re 

match = re.search('[#\t]', line) 
if match: 
    i, j = match.span() 
    return (line[:i], line[i:j], line[j:]) 
return (line, '', '') 

這將給出類似於分區的結果:(head,sep,tail)的元組。

0

我只是先將分割線分成三部分,分割爲#,然後再分割'\ t'。

可以做什麼(帶分區如上所述)是:

first_word,空間,其餘=行。分區('\ t')

現在在first_word中,您將零件拆分爲\ t(選項卡)。但是,如果還有其他類似#的內容,您可以進一步拆分它。例如:

first_word_2,S_2,R_2 = first_word.partition( '#')

現在first_word_2你應該有你想要的東西。

小號

相關問題