我有一个字符串'test',只有字母a,b,c和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)
有帮助吗?
基于我的评论链接和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)