2012-01-31 151 views
44

什麼是最好的純Python實現來檢查一個字符串是否包含字母表中的任何字母?如何檢查字符串是否包含字母表中的任何字母?

string_1 = "(555).555-5555" 
string_2 = "(555) 555 - 5555 ext. 5555 

string_1將返回False對於具有它沒有字母表的字母和string_2將返回True具有信件。

+1

是否僅限於英語a/z字母表?應該考慮像德文這樣的來自其他字母的「特殊」字符嗎? – Kotch 2012-01-31 00:35:32

+0

你有沒有機會收到unicode?或者只是簡單的ascii羅馬字母? – KobeJohn 2012-01-31 00:39:06

+0

好時機:)無論如何,如果你需要使用unicode字符測試字符串的幫助,請檢查這個類似的問題。 – KobeJohn 2012-01-31 00:44:52

回答

66

正則表達式應該是一個快速的方法:

re.search('[a-zA-Z]', the_string) 
+1

謝謝JBernado,這就是我最終做的事情,它完美地工作,完成我需要做的事情。 – 2012-01-31 17:16:22

+4

@JustinPapez你應該接受這個答案然後... – sadmicrowave 2013-05-30 18:16:12

+0

哎呀,我完全忘了,謝謝你的提醒。 – 2013-06-01 17:53:29

49

如何:

>>> string_1 = "(555).555-5555" 
>>> string_2 = "(555) 555 - 5555 ext. 5555" 
>>> any(c.isalpha() for c in string_1) 
False 
>>> any(c.isalpha() for c in string_2) 
True 
+0

'set(string_1)'會更有效嗎? – 2012-01-31 00:41:04

+1

@Rik。你的意思是在測試之前將string_1轉換爲一個集合?不,它不會更有效率。這是保證處理所有角色至少一次,而我相信任何功能會遇到第一個虛假時短路(停止)。 – KobeJohn 2012-01-31 00:43:32

+0

此代碼會稍微慢一些,因爲它需要每個字符的函數調用。轉換爲'set'可能會或不會減少函數調用,但會增加一些開銷。 – JBernardo 2012-01-31 00:45:31

8

您可以使用正則表達式是這樣的:

import re 

print re.search('[a-zA-Z]+',string) 
9

您可以在字符串中使用islower()看看它是否包含一些小寫字母(以及其他字符)。 orisupper()也檢查是否包含一些大寫字母:

下面

:字母串的:測試良率真

>>> z = "(555) 555 - 5555 ext. 5555" 
>>> z.isupper() or z.islower() 
True 
下面

:在字符串中沒有字母:測試良率假。

>>> z= "(555).555-5555" 
>>> z.isupper() or z.islower() 
False 
>>> 

不要與isalpha()返回True只有當所有字符是字母,這是不是你想要的東西混在一起。

請注意,Barm的回答非常好,因爲我沒有很好地處理混合情況。

+1

我喜歡這將測試它是否包含字母,而不僅僅是測試如果輸入是全部字母。 – Cornbeetle 2017-04-20 16:14:02

+0

@Cornbeetle是的,那種真正回答所有這些年來的問題,謝謝 – 2017-04-20 16:33:33

2

我喜歡@ jean-françois-fabre提供的答案,但它不完整。
他的方法將工作,但只有當文本包含純小寫或大寫字母:

>>> text = "(555).555-5555 extA. 5555" 
>>> text.islower() 
False 
>>> text.isupper() 
False 

更好的方法是先大寫或小寫您的字符串,然後檢查。

>>> string1 = "(555).555-5555 extA. 5555" 
>>> string2 = '555 (234) - 123.32 21' 

>>> string1.upper().isupper() 
True 
>>> string2.upper().isupper() 
False 
相關問題