什么是最好的纯Python实现,以检查字符串是否包含字母表中的任何字母?
string_1 = "(555).555-5555"
string_2 = "(555) 555 - 5555 ext. 5555
哪里string_1
会False
因为没有字母而string_2
返回True
,而会因为有了字母而返回。
什么是最好的纯Python实现,以检查字符串是否包含字母表中的任何字母?
string_1 = "(555).555-5555"
string_2 = "(555) 555 - 5555 ext. 5555
哪里string_1
会False
因为没有字母而string_2
返回True
,而会因为有了字母而返回。
Answers:
正则表达式应该是一种快速的方法:
re.search('[a-zA-Z]', the_string)
any(c.isalpha() for c in string_1)
是美味的Pythonic。
isalpha
甚至意味着什么?将Python 2与Python 3进行比较时,这将具有完全不同的行为。中文是字母的一部分吗?如果不是这样,您就盲目地将其与Python 3上的生成器匹配(或Unicode字符串为Python 2!)。如果您要使用Pythonic,则为:Simple is better than complex.
。并检查上面OP的评论:他只希望匹配罗马字母。
Match
对象,如果有匹配项,或者None
没有匹配项。因此,这与if re.search(...
模式兼容。
怎么样:
>>> 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
set(string_1)
更有效吗?
set
可能会或可能不会减少函数调用,但会增加一些开销。
您可以islower()
在字符串上使用以查看它是否包含一些小写字母(以及其他字符)。or
它isupper()
也检查是否包含一些大写字母:
下图:字符串中的字母:测试结果为true
>>> z = "(555) 555 - 5555 ext. 5555"
>>> z.isupper() or z.islower()
True
下图:字符串中没有字母:test得出false。
>>> z= "(555).555-5555"
>>> z.isupper() or z.islower()
False
>>>
不要混淆,仅当所有字符都是字母时才isalpha()
返回True
,这不是您想要的。
我喜欢@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
我测试了上述每种方法,以确定给定字符串中是否包含任何字母,并找出标准计算机上每个字符串的平均处理时间。
约250 ns
import re
约3 µs
re.search('[a-zA-Z]', string)
约6 µs
any(c.isalpha() for c in string)
约850 ns
string.upper().isupper()
与所谓的相反,导入re所花费的时间可以忽略不计,并且即使对于相对较小的字符串,与迭代isalpha()相比,使用re进行搜索仅花费大约一半的时间。
因此,对于更大的字符串和更大的计数,re将显着提高效率。
但是将字符串转换为大小写并检查大小写(例如,upper()。isupper()或lower()。islower()中的任何一个)在这里胜出。在每个循环中,它都比re.search()快得多,甚至不需要任何其他导入。