我刚开始使用正则表达式。我无法创建一个表达式来检查数字是否只包含1和0而没有其他内容。 在python中
re.match("[01]", b)
我认为这匹配0或1。
检查字符串是否包含给定集合的所有元素的表达式是什么。
答案 0 :(得分:3)
添加锚点和量词:
re.match("^[01]+$", b)
现在,如果表达式由一个或多个字符组成,则表达式仅匹配字符串,每个字符都是0
或1
。 ^
开头和$
结束字符串确保只能匹配整行。
+
是一个量词,它意味着前面的元素([01]
字符类)需要至少匹配一次。这意味着空字符串也不匹配。
演示:
>>> import re
>>> re.match("^[01]+$", '011001')
<_sre.SRE_Match object at 0x10a06c5e0>
>>> re.match("^[01]+$", '0110012') is None
True
>>> re.match("^[01]+$", '') is None
True
regex101.com的在线演示。
但是,如果您的输入字符串必须至少包含 0
和1
,则可以使用集合:
b and set(b) == {'0', '1'}
这会测试一个非空值b
,它完全由0
和1
个字符组成,都必须存在。
您可以使用前瞻表达式使用正则表达式执行此操作:
re.match(r'^(?=.*1)[01]+$', b)
此处(?=.*1)
仅匹配,如果后面的文字中至少有1 1
个字符,但不会直接与文字匹配。
regex101.com的在线演示。
正则表达式要快得多:
>>> import timeit
>>> import re
>>> def nonzero_binary_set(b):
... return b and set(b) == {'0', '1'}
...
>>> def nonzero_binary_re(b):
... return re.match(r'^(?=.*1)[01]+$', b) is not None
...
>>> tests = ['', '00101011001110', '000000000000', '1111111111111',
... '10100011010101' * 1000, '0' * 10000]
>>> timeit.timeit('map(f, tests)', 'from __main__ import tests, nonzero_binary_set as f', number=10000)
3.7346549034118652
>>> timeit.timeit('map(f, tests)', 'from __main__ import tests, nonzero_binary_re as f', number=10000)
0.8998291492462158
答案 1 :(得分:3)
您可以使用^[01]+$
说明:
^
是字符串
的开头
$
是字符串
的结尾
+
表示匹配一个或多个,在这种情况下是[01]
中的一个或多个。
答案 2 :(得分:3)
您可以使用:
re.match("^[01]+$", b)
^
- 匹配字符串的开头
[01]
- 匹配0
或1
+
- 表示前一个字符中的一个或多个(一个或多个[01]
)
$
- 匹配字符串的结尾
您可以在python here中阅读有关正则表达式的更多信息。
答案 3 :(得分:2)
如果您接受基于正则表达式的解决方案,那么以下测试可能对您有用:
>>> set("011010")
{"0", "1"}
从字符串创建集合会将字符串视为可迭代的,其中每个项目都是一个字符。
设置选择迭代中找到的每个唯一值的一个表示。
使用另一个字符串:
>>> set("0110310")
{"0", "1", "3"}
所以测试看起来像:
>>> set("011010") == {"0", "1"}
True
>>> set("0110910") == {"0", "1"}
False
该测试甚至适用于空字符串:
>>> set("")
set()
>>> set("") == {"0", "1"}
False