Python 使用正则表达式匹配奇数为0、偶数为1的二进制字符串

Python 使用正则表达式匹配奇数为0、偶数为1的二进制字符串,python,regex,Python,Regex,[修订信息] 一些有效输入 101 10001 00011 11000 0 一些无效输入 十一, 00 10101 101111 编辑: 对于那些认为ReGeX不是解决问题的方法的人来说,这是绝对正确的,但是对于这个问题,我需要使用ReGeX。 此外,我对simpler的定义是减少正则表达式中的字符数(最小长度约为22个字符)使用集合中的计数器是另一种方法。它可以很容易地查找奇偶序列,并确保字符串只有1和0 from collections import Counter def is_

[修订信息]

一些有效输入

  • 101
  • 10001
  • 00011
  • 11000
  • 0
一些无效输入

  • 十一,
  • 00
  • 10101
  • 101111
编辑: 对于那些认为ReGeX不是解决问题的方法的人来说,这是绝对正确的,但是对于这个问题,我需要使用ReGeX。
此外,我对simpler的定义是减少正则表达式中的字符数(最小长度约为22个字符)

使用
集合中的
计数器是另一种方法。它可以很容易地查找奇偶序列,并确保字符串只有1和0

from collections import Counter

def is_valid_binary_string(test_string):
    c = Counter(test_string)
    
    # Not valid if anything other than 1s and 0s
    if set(c.keys()) - {"0", "1"}:
        return False
    
    # Valid only if even number of 1s and odd number of 0s
    return c["1"] % 2 == 0 and c["0"] % 2 == 1

对此,您不需要
regex
。使用
string.count()
并检查响应是奇数还是偶数来实现这一点非常简单

testcases = ['101', '10001', '00011', '11000', '0', '11', '00', '10101', '101101111']
for string in testcases:
    print(string, 'Valid' if string.count('0') % 2 == 1 and string.count('1') % 2 == 0 else 'Invalid')
输出

101 Valid
10001 Valid
00011 Valid
11000 Valid
0 Valid
11 Invalid
00 Invalid
10101 Invalid
101101111 Invalid

如果你决定用正则表达式来做这件事,那么对于“simplify”的某些定义,这可能是合适的

(?=^0*((10*){2})*?$)(?=^1*(01*)((01*){2})*?$)^*$
(?=)断言
^$位于字符串的开头和结尾之间
0*(使用前导零)
(        )*?                                  出现的次数视需要而定
{2} 两例
(10*)后跟任意数量0的1
(?=^1*((01*){2})*?$)执行与前面相同的检查
(01*)但在开始时需要额外的0
这依赖于
{2}
量词要求所讨论的数字为2的倍数,而不是一次全部验证字符串,而是对字符串执行2次检查:第一次检查1的偶数,第二次检查0的偶数,再加上额外的0


什么使你认为它可以简化?你必须用字符串匹配符号来描述有限状态机中的所有循环和路径。。。一种固有的混乱的努力。您是否有特别的证据表明这可以而且应该减少?如果不是,你真的是在要求我们自己做作业,比较答案。我不认为正则表达式是最好的方法。为什么不干脆
str.count
?@ScottHunter我之所以知道它可以简化,是因为我的教授这么说的。他说这个概念可以简化为22个字符。谢谢尼克的回答!这是我想要的简化的定义,多亏了你的回答,我想我找到了一种方法来简化它(从角色角度来说)甚至更多@真高兴我能帮上忙!如果你发现了一个简单的版本,请考虑把它作为你自己的问题的答案并接受它。我一定会这样做,谢谢!