如何检查字符串是否包含字母表中的任何字母?

检查字符串是否包含字母表中的任何字母的最佳纯 Python 实现是什么?

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

如果 string_1中没有字母表中的字母,则返回 False; 如果 string_2中有字母,则返回 True

280624 次浏览

How about:

>>> 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

正则表达式应该是一种快速的方法:

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

你可以这样使用正则表达式:

import re


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

您可以在字符串上使用 islower()来查看它是否包含一些小写字母(以及其他字符)。它与 isupper()也检查是否包含一些大写字母:

below: letters in the string: test yields true

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

下面: 字符串中没有字母: 测试结果为 false。

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

不要与 isalpha()混淆,isalpha()只有在所有字符都是字母的情况下才返回 True,这不是您想要的。

注意,Barm 的答案很好地完成了我的,因为我的答案不能很好地处理混合情况。

我喜欢 @ 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

此外,还可以这样做

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

Also note that if variable Val returns None. That means the search did not find a 火柴

我测试了上面的每一种方法,找出是否有字母包含在给定的字符串中,并找出了标准计算机上每个字符串的平均处理时间。

~ 250 ns

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()


与所声称的相反,导入 是的花费的时间可以忽略不计,与迭代 Isalpha ()相比,使用 是的搜索只需要 中场休息,即使对于相对较小的字符串也是如此。
因此,对于更大的字符串和更大的计数,re 的效率要高得多。

但是在这里将字符串转换为 case 并检查 case (即 Upper () . isupper () Low () . islow ()中的任何一个) 赢了。在每个循环中,它都明显快于 研究(),甚至不需要任何额外的导入。