2015-06-24 58 views
-3

前導字符例如大多數Python化是去除所有非字母數字串從

[email protected]#123myname --> myname 
[email protected]#[email protected]#123 --> [email protected]#123 

有很多S.O.的「刪除所有字母數字字符的大多數pythonic方法」的例子,但如果我只想刪除導致第一個字母字符的非字母字符,那麼最好的方法是什麼?

我可以用while循環,但尋找一個更好的解決方案蟒

+1

怎麼你的循環看? –

+0

你認爲'é'是字母數字嗎? '''和'1.2'一樣呢? – TessellatingHeckler

+1

@Blythe,你可以將你的問題標題與你的問題主體相匹配,並添加你認爲的*字母字符*? –

回答

-2

:如果您只想刪除

while not s[0].isalnum(): s = s[1:] 

領先的非字母字符:

while not s[0].isalpha(): s = s[1:] 

樣品:

s = '[email protected]#[email protected]#' 
while not s[0].isalpha(): s = s[1:] 
print(s) 

輸出:

[email protected]# 
+0

非常優雅,謝謝 –

+0

''1'.isalnum()' - >'True',''''isalpha()' - >'False' – vaultah

+0

@vaultah對不起,我編輯了你之後的問題回答了。我的意思是非字母字符,而不是非字母數字字符。你的回答對原始問題是正確的,我的錯誤 –

6

只需使用str.lstrip IM做到這一點。

它需要一個包含要從字符串左側移除的字符的字符串,並將刪除這些字符,而不管它們出現的順序如何。例如:

s = "[email protected]#[email protected]#" 
print s.lstrip('@!#') # [email protected]# 
+0

這是迄今爲止最pythonic的答案。如果你想刪除所有標點符號,你也可以使用's.lstrip(string.punctuation)' – Granitosaurus

+2

雖然這很好而且可讀,但它可能不會像所述的那樣回答問題。海報想要從字符串的開頭刪除所有*非字母數字*字符。目前還不清楚是否只有非字母數字字符是'!@#'(或者在'string.punctuation'中)。更通用的解決方案是首先用'剩餘物=集(s) - 集(string.ascii_letters)',然後strip:'s.lstrip(str(剩餘物))'來找到它們。如果'!@#'是OP所期望的,這個答案可能就足夠了。 – jme

2

你可以使用正則表達式在字符串的開始匹配非字母數字字符:

s = '[email protected]#myname!!' 
r = re.compile(r"^\W+") # \W non-alphanumeric at start^of string 

輸出:

In [28]: r = re.compile(r"^\W+") 
In [29]: r.sub("",'[email protected]#myname') 
Out[29]: 'myname'  
In [30]: r.sub("",'[email protected]#[email protected]#') 
Out[30]: '[email protected]#' 

\W+將繼續強調這樣在開始時只保留字母和數字我們可以:

s = '[email protected]#_myname!!' 
r = re.compile(r"^[^A-Za-z0-9]+") 

print(r.sub("",s)) 
myname!! 

如果你想只是刪除到第一個字母:如果你想刪除導致非字母/數字值

r = re.compile(r"^[^A-Za-z]+") 
+0

嗯不''[^ A-Za-z0-9]'只執行ASCII碼匹配? – vaultah

相關問題