什么是最好的纯Python实现来检查字符串是否包含字母表中的任何字母?
string_1 = "(555).555-5555"
string_2 = "(555) 555 - 5555 ext. 5555
Run Code Online (Sandbox Code Playgroud)
如果没有字母表中的字母,string_1
将返回哪里False
,string_2
并将返回True
有信.
JBe*_*rdo 100
正则表达式应该是一个快速的方法:
re.search('[a-zA-Z]', the_string)
Run Code Online (Sandbox Code Playgroud)
DSM*_*DSM 61
怎么样:
>>> 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
Run Code Online (Sandbox Code Playgroud)
Jea*_*bre 20
您可以islower()
在字符串上使用它来查看它是否包含一些小写字母(以及其他字符).or
它还isupper()
检查是否包含一些大写字母:
下面:字符串中的字母:test得到true
>>> z = "(555) 555 - 5555 ext. 5555"
>>> z.isupper() or z.islower()
True
Run Code Online (Sandbox Code Playgroud)
下面:字符串中没有字母:test产生错误.
>>> z= "(555).555-5555"
>>> z.isupper() or z.islower()
False
>>>
Run Code Online (Sandbox Code Playgroud)
为了不被混淆与isalpha()
返回True
只有当所有字符是字母,这是不是你想要的.
请注意,Barm的答案很好地完成了,因为我的处理好不好.
我喜欢@jean-françois-fabre提供的答案,但答案不完整。
他的方法将起作用,但前提是文本仅包含小写或大写字母:
>>> text = "(555).555-5555 extA. 5555"
>>> text.islower()
False
>>> text.isupper()
False
Run Code Online (Sandbox Code Playgroud)
更好的方法是先对字符串进行大写或小写,然后再检查。
>>> string1 = "(555).555-5555 extA. 5555"
>>> string2 = '555 (234) - 123.32 21'
>>> string1.upper().isupper()
True
>>> string2.upper().isupper()
False
Run Code Online (Sandbox Code Playgroud)
您可以使用这样的正则表达式:
import re
print re.search('[a-zA-Z]+',string)
Run Code Online (Sandbox Code Playgroud)
小智 6
我测试了上述每种方法,以查找给定字符串中是否包含任何字母表,并找出标准计算机上每个字符串的平均处理时间。
约 250 纳秒
import re
Run Code Online (Sandbox Code Playgroud)
约 3 微秒
re.search('[a-zA-Z]', string)
Run Code Online (Sandbox Code Playgroud)
约 6 微秒
any(c.isalpha() for c in string)
Run Code Online (Sandbox Code Playgroud)
约 850 纳秒
string.upper().isupper()
Run Code Online (Sandbox Code Playgroud)
与所声称的相反,导入re花费的时间可以忽略不计,与迭代isalpha()相比,即使对于相对较小的字符串,使用re搜索也只花费大约一半的时间。
因此,对于更大的字符串和更大的计数, re 会更有效。
但是将字符串转换为大小写并检查大小写(即upper().isupper()或lower().islower() 中的任何一个)在这里获胜。在每个循环中,它都比re.search()快得多,甚至不需要任何额外的导入。