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

Jus*_*pez 65 python string

什么是最好的纯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)

  • 正则表达式肯定有点矫枉过正.`any(c_1isalpha()for string in string_1)`很好吃Pythonic. (20认同)
  • 如果其他人想知道返回值是什么,如果匹配则会得到一个`Match`对象,如果没有则得到'None`.所以这与`if re.search(...`模式)兼容. (10认同)
  • @JBernardo 知道从哪个模块导入并不是一件小事。至少应该提到这一点。从 `re` 模块导入正则表达式操作(Python 2.7 到 3.9.5)。 (5认同)
  • @Joseph不,不是.这个正则表达式比你的表达式更具可读性.另外,`isalpha`甚至意味着什么?将Python 2与Python 3进行比较时,这将有完全不同的行为.中文是字母表的一部分吗?如果没有,你就会在Python 3上盲目地将它与你的生成器匹配(或者用于unicode字符串的Python 2).如果你想要*Pythonic*,这里是:`简单比复杂更好.并查看上面的OP评论:他只希望匹配罗马字母. (4认同)

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)

  • @JBernardo:timeit表明它比编译的正则表达式慢一个数量级,并且比非编译的正则表达式仅花费大约66%的时间.这完全符合我的"我讨厌正则表达式"的限制. (2认同)
  • 当然:如果您使用“(555).555-5555 ext. 5555”*1000,由于短路,您将恢复到可比较的速度。与编写正则表达式相比,我更喜欢用 Python 编写正则表达式,除非它们是微不足道的,否则我发现很难调试,而且除非性能要求需要,否则我不会放弃编写清晰的 Py​​thon。 (2认同)

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的答案很好地完成了,因为我的处理好不好.

  • 我喜欢这将测试它是否包含字母,而不仅仅是测试输入是否为所有字母。 (4认同)

Bar*_*arm 9

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


shi*_*bly 8

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

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()快得多,甚至不需要任何额外的导入。


  • 您还可以编译正则表达式以进行进一步优化。alpha_regex = re.compile('[a-zA-Z]') 稍后 alpha_regex.search(string) (2认同)