2011-02-25 28 views
1

下面是我的代碼獲取代碼(總是在括號中,始終有3個字符)的字符串:它是python中最簡單的子字符串嗎?

raw_text='Spain (BCN)' #another examples: 'Italy (BGN)' , 'Germany (SXF)' 
formatted_text=raw_text[raw_text.index('(')+1:len(raw_text)-1] # BCN,BGN,SFX 

我能寫簡單的?

+0

2行有什麼問題? – 2011-02-25 11:39:08

+0

你也可以使用正則表達式....所以檢查're'模塊的文檔...它是正則表達式基礎... – 2011-02-25 11:41:02

+0

@同步Quacker:第二行是臃腫的。 – 2011-02-25 11:42:24

回答

3

如果你一定有這樣的格式爲什麼不直接使用:

s.strip()[-4: -1] 

當然,它不檢查你的字符串格式。如果你想這樣做,使用re模塊(正則表達式)。

希望這有助於

低糜

0
>>> raw_text='Spain (BCN)' 
>>> formatted_text=raw_text[raw_text.index('(')+1:len(raw_text)-1] 
>>> formatted_text 
'BCN' 
>>> raw_text[raw_text.index('(')+1:-1] 
'BCN' 
>>> 

涉嫌非脆性的作用:

>>> str = 'abcdefgh' 
>>> str[str.find('(')+1:str.find(')')] 
'abcdefg' 
>>> 
+0

這更簡單,但也更脆弱。如果字符串不以')'結尾,則會中斷,這是不好的。 – x10 2011-02-25 11:42:26

+1

@ x10:它不是**更脆弱。它給出了與OP表達式完全相同的結果。 – 2011-02-25 11:45:51

0

不,這是不夠好。你可以創建一個接受一個字符串並返回格式的函數。

此外,請不要使用len(raw_text)-1,因爲這會導致「意大利(BGN)」等不良數據失敗。

def get_code(str): 
    return str[str.find('(')+1:str.find(')')] 

formatted_text = get_code(raw_text) 
+2

隱藏內置插件是一種非常不好的習慣。 – 2011-02-25 11:47:48

3
import re 
raw_text='Spain (BCN)' 
formatted_text = re.search(r""" 
    (?<=\() # assert that the preceding character is a (
    \w{3} # match three alphanumeric characters 
    (?=\)) # assert that the following character is a)""", 
    raw_text, re.VERBOSE).group(0) 

會做(用正則表達式)的另一種方式。

+0

正則表達式在這種情況下是最好的選擇 – Exelian 2011-02-25 11:46:39

+0

這可能是更通用的,但是如果他的輸入文本嚴格按照他的指定,這並不是簡單的。避免向前看/向後看將會有所幫助 - 它們很少被使用,所以大多數人不得不查看它們。 're.search(r「\((。{3})\)」,text)。(1)' – 2011-02-25 12:57:30

+0

@Glenn:我會說我幾乎每一天都在使用lookahead/lookbehind。這不是一個罕見的用法。 – tchrist 2011-02-27 11:21:48

0

您可以使用正則表達式

>>> import re 
>>> re.search('\((.{3})\)', 'Spain (BCN)').group(0) 
'BCN' 
1

業有肯定的是。

raw_text='Spain (BCN) ' 
print raw_text.rstrip(" ")[-4:-1] 

使用rstrip刪除尾隨空格,例如修剪。 然後,只需返回4個字符,至-1個字符。

1

拼接一個字符串是[start:stop]而您正在停止len(raw_text)-1 - 總是倒數第二個字符。如果你知道代碼繼續字符串的結束,和你說這始終是三個字符長的話:

formatted_text=raw_text[-4:-1] 

將提取從字符串

月底開始4三個大字
相關問題