检查字符串的任何(所有)字符是否在给定范围内

新手上路,请多包涵

我有一个包含 unicode 符号(西里尔文)的字符串:

 myString1 = 'Австрия'
myString2 = 'AustriЯ'

我想检查字符串中的所有元素是否都是英文(ASCII)。现在我正在使用一个循环:

 for char in myString1:
    if ord(s) not in range(65,91):
         break

因此,如果我找到第一个非英语元素,我就会打破循环。但是对于给定的示例,您可以看到字符串可以在末尾包含很多英文符号和 unicode。这样我将检查整个字符串。此外,如果所有字符串都是英文的,我仍然会检查每个字符。

有没有更有效的方法来做到这一点? 我在想类似的事情:

 if any(myString[:]) is not in range(65,91)

原文由 Mikhail_Sam 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 606
2 个回答

您可以使用 setO(1) 包含检查)来加快检查速度,尤其是在检查相同范围内的多个字符串时,因为初始集创建也需要一次迭代。然后,您可以将 all 用于比 any 更适合的早期迭代模式:

 import string

ascii = set(string.ascii_uppercase)
ascii_all = set(string.ascii_uppercase + string.ascii_lowercase)

if all(x in ascii for x in my_string1):
    # my_string1 is all ascii

当然,任何 all 构造都可以通过 DeMorgan 定律 转换为 any

 if not any(x not in ascii for x in my_string1):
    # my_string1 is all ascii

更新:

正如 Artyer 所指出的,一种基于纯集的方法不需要完整的迭代:

 if ascii.issuperset(my_string1):
    # my_string1 is all ascii

原文由 user2390182 发布,翻译遵循 CC BY-SA 3.0 许可协议

另一种方式就像@schwobaseggl 建议的那样,但使用全套方法:

 import string
ascii = string.ascii_uppercase + string.ascii_lowercase
if set(my_string).issubset(ascii):
    #myString is ascii

原文由 Netwave 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题