【问题标题】:Recognize a string containing only digits and "/" symbols in Python在 Python 中识别仅包含数字和“/”符号的字符串
【发布时间】:2021-12-18 19:53:30
【问题描述】:

我有一个短字符串,需要一种方法来识别该字符串中是否只有数字和/或“/”符号。如果字符串中有字母或其他一些符号 - 这是不行的。只允许数字和“/”。

例如:

a = '123456' - 绿灯

b = '123//6' - 绿灯

c = '1m3456' - 不行

d = '1/80o0' - 不行

【问题讨论】:

  • 一种方法是使用正则表达式。
  • 您可以使用正则表达式,例如测试re.search('[^0-9/]', your_string) == None
  • set(your_string) <= set('0123456789/')
  • 值得一提的是,@PeterWood 评论中的 <= 大致相当于 Daweo 的回答中对 issubset 的调用 - 不同之处在于 <= 需要设置两个操作数,而参数to issubset 可以是任何可迭代的。

标签: python string symbols digits


【解决方案1】:

只需使用set 算术

def onlyallowed(text,allowed="/0123456789"):
    return set(text).issubset(allowed)
print(onlyallowed("123456")) # True
print(onlyallowed("123//6")) # True
print(onlyallowed("1m3456")) # False
print(onlyallowed("1/80o0")) # False

说明:将文本转换为(字符的)集合,并检查所有这些character 是否存在于允许的范围内。可选的allowed 可能用于部署另一组允许的字符,例如只允许0s 和1s:

print(onlyallowed("01011",allowed="01"))  # True

如果您希望处理很长的文本,并且在开头附近包含不允许的字符,您可以选择使用all 结合理解,如下所示

def onlyallowed(text,allowed="/0123456789"):
    return all(i in allowed for i in text)

all 的行为是在遇到非真值后立即变为return False(在这种情况下为False,就像我做会员测试一样)

【讨论】:

  • 正要说同样的话 (+1) ;)
  • 谢谢大家,很好的答案。我更喜欢使用集合,而不是 RE,因为保持效率和速度对我来说很重要
  • 我想知道从allowed 而不是text 构建集合的速度差异是什么。对于较长的文本可能会更快,因为它会更快地失败。
【解决方案2】:
import re

def recognize(self):
    if re.search(r"[a-b]", self) is not None:
        print("Red Light")
    elif re.search(r"[0-9]|/", self) is not None:
        print("Green Light")

recognize(your_string)

如果recognize()函数在字符串中找到一个字母,则输出“红灯”,否则如果找到数字或“/”,则输出“绿灯”。

【讨论】:

    【解决方案3】:

    我相信这就是您要找的:

    strings = ['123456', '123//6', '1m3456', '1/80o0']
    
    print([string.replace('/', '').isdigit() for string in strings])
    

    简单地删除任何 / 字符(如果存在)并检查它是否都是数字对我来说似乎更具可读性,并且更符合您用英语描述的方式:)

    希望这会有所帮助。干杯!

    【讨论】:

      猜你喜欢
      • 2014-03-08
      • 2020-02-19
      • 2020-03-30
      • 1970-01-01
      • 2016-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-26
      相关资源
      最近更新 更多