什么是最好的纯Python实现来检查字符串是否包含字母表中的任何字母?
string_1 = "(555).555-5555"
string_2 = "(555) 555 - 5555 ext. 5555
string_1
将返回False
,因为其中没有字母,而string_2
会返回True
来收信。
答案 0 :(得分:93)
正则表达式应该是一种快速的方法:
re.search('[a-zA-Z]', the_string)
答案 1 :(得分:55)
怎么样:
>>> 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
答案 2 :(得分:17)
您可以在字符串上使用islower()
来查看它是否包含一些小写字母(以及其他字符)。 or
与isupper()
同时检查是否包含大写字母:
下面:字符串中的字母:test yield true
>>> z = "(555) 555 - 5555 ext. 5555"
>>> z.isupper() or z.islower()
True
下面:字符串中没有字母:test产生错误。
>>> z= "(555).555-5555"
>>> z.isupper() or z.islower()
False
>>>
只有当所有字符都是字母时,isalpha()
才会返回True
,这不是你想要的。
请注意,Barm's答案很好地完成了,因为我的处理好不好。
答案 3 :(得分:8)
你可以使用这样的正则表达式:
import re
print re.search('[a-zA-Z]+',string)
答案 4 :(得分:6)
我喜欢@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
答案 5 :(得分:0)
您还可以另外执行此操作
import re
string='24234ww'
val = re.search('[a-zA-Z]+',string)
val[0].isalpha() # returns True if the variable is an alphabet
print(val[0]) # this will print the first instance of the matching value
另请注意,如果变量 val 返回None。这意味着搜索未找到匹配
答案 6 :(得分:0)
我测试了上述每种方法,以确定给定字符串中是否包含任何字母,并在标准计算机上找出每个字符串的平均处理时间。
〜250 ns for
import re
〜3 µs for
re.search('[a-zA-Z]', string)
〜6 µs for
any(c.isalpha() for c in string)
〜850 ns
string.upper().isupper()
与所谓的相反,导入 re 所需的时间可以忽略不计,而与 re 进行搜索相比,只需大约一半的时间即使是相对较小的字符串,也可以迭代 isalpha()。
因此,对于更大的字符串和更大的计数,re会大大提高效率。
但是将字符串转换为大小写并检查大小写(即 upper()。isupper()或 lower()。islower()中的任何一个)在这里赢。在每个循环中,它比 re.search()快得多,甚至不需要任何其他导入。