用于查找偶数a,c和偶数b,d的正则表达式

Dad*_*adu 1 regex

我有一个字符串'test',只有字母a,b,c和d.

如果满足以下两个条件,则称"测试"是平衡的:

  • 总数'a'和'c'是偶数
  • 'b'和'd'的总和是偶数.

需要提出一个正则表达式模式,当使用类似的东西搜索字符串时:

print(str(bool(re.search(Regex_Pattern, raw_input()))).lower()) 
Run Code Online (Sandbox Code Playgroud)

例如

    cdba -> true (a+c = 2 and b+d = 2)
    aaccb -> false (aa+cc = 4 and b = 1)
Run Code Online (Sandbox Code Playgroud)

有帮助吗?

Mat*_*eus 5

基于我的评论链接和sideroxylon的答案(我必须添加,因为OP在python中要求这个答案),你可以这样做:

import re
my_string = "abcddcad"
ac = len(re.findall("a|c", my_string))
bd = len(re.findall("b|d", my_string))
if ac % 2 == 0 and bd % 2 == 0:
  print('both even')
Run Code Online (Sandbox Code Playgroud)

注意:
正如你所说的那样,你的问题需要正则表达式,如果你在我的答案中没有看到正则表达式,我实际上是在这两种方法中使用它:

import re
re.findall("a|c", my_string)
re.findall("b|d", my_string)
Run Code Online (Sandbox Code Playgroud)

但是,算术必须手动完成.正则表达式只是一种搜索文本的模式,它不会为您返回布尔值.但你仍然可以通过这种视觉上糟糕的方法组合来获得它们:

import re
my_string = "abcdabab"
result = len(re.findall("a|c", my_string))%2 == 0 and len(re.findall("a|c", my_string))%2 == 0
print(result); // True or False
Run Code Online (Sandbox Code Playgroud)

编辑:

我不知道你为什么需要使用re.seach,因为你应该可以使用re.findall,因为这是返回列表的唯一方法......然而,有一段时间我的美丽睡眠浪费我已经成功创造了这个表达:

^(?=(?:[^ac\n]*(?:a|c)[^ac\n]*(?:a|c))*[^ac\n]*$)(?=(?:[^bd\n]*(?:b|d)[^bd\n]*(?:b|d))*[^bd\n]*$).*$
Run Code Online (Sandbox Code Playgroud)

StackOverflow©Mateus 2017(此正则表达式现已受版权保护:D)
https://regex101.com/r/TmceLu/1

因为这个正则表达式太过宽松,我不打算在这里详细说明,但是第一个预测应该只匹配偶数个as和cs,而另一个预测只有bs和ds的偶数.如果你想要解释,看看塞巴斯蒂安的答案,并使用他的这个正则表达式的较短版本:

^(?=(?:(?:[ac]*[bd]){2})*[ac]*$)(?:(?:[bd]*[ac]){2})*[bd]*$
Run Code Online (Sandbox Code Playgroud)

这样你就可以像这样简单地提取布尔值:

import re
my_string = "abcddcbccadacbac"
result = bool(re.search("^(?=(?:(?:[ac]*[bd]){2})*[ac]*$)(?:(?:[bd]*[ac]){2})*[bd]*$", my_string))

print(result) // True or False
Run Code Online (Sandbox Code Playgroud)