使用正则表达式检查数字是否由0和1组成

时间:2014-07-05 16:28:42

标签: python regex

我刚开始使用正则表达式。我无法创建一个表达式来检查数字是否只包含1和0而没有其他内容。 在python中

re.match("[01]", b)

我认为这匹配0或1。

检查字符串是否包含给定集合的所有元素的表达式是什么。

4 个答案:

答案 0 :(得分:3)

添加锚点和量词:

re.match("^[01]+$", b)

现在,如果表达式由一个或多个字符组成,则表达式仅匹配字符串,每个字符都是01^开头和$结束字符串确保只能匹配整行。

+是一个量词,它意味着前面的元素([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的在线演示。

但是,如果您的输入字符串必须至少包含 01 ,则可以使用集合:

b and set(b) == {'0', '1'}

这会测试一个非空值b,它完全由01个字符组成,都必须存在

您可以使用前瞻表达式使用正则表达式执行此操作:

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] - 匹配01

+ - 表示前一个字符中的一个或多个(一个或多个[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