我有一个字符串' test',只有字母a,b,c和d。
'测试'如果满足以下两个条件,则说是平衡的:
需要提出一个正则表达式模式,当使用类似的东西搜索字符串时
print(str(bool(re.search(Regex_Pattern, raw_input()))).lower())
例如。
cdba -> true (a+c = 2 and b+d = 2)
aaccb -> false (aa+cc = 4 and b = 1)
任何帮助?
答案 0 :(得分: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')
注意:强>
正如你所说的正则表达式需要你的问题,如果你在我的答案中没有看到正则表达式,我实际上是在这两种方法中使用它:
import re
re.findall("a|c", my_string)
re.findall("b|d", my_string)
但是,算术必须手动完成。正则表达式只是一种搜索文本的模式,它不会为您返回布尔值。但你仍然可以通过这种视觉上糟糕的混合方法来获取它们:
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
我不知道您为什么需要来使用re.seach
,因为您应该能够使用re.findall
,因为这是返回列表的唯一方法。 ..然而,有一段时间我的美容睡眠的浪费我设法创造了这个表达:
^(?=(?:[^ac\n]*(?:a|c)[^ac\n]*(?:a|c))*[^ac\n]*$)(?=(?:[^bd\n]*(?:b|d)[^bd\n]*(?:b|d))*[^bd\n]*$).*$
StackOverflow©Mateus 2017(此正则表达式现已受版权保护:D)
https://regex101.com/r/TmceLu/1
因为这个正则表达式太过宽松,我不打算在这里详细说明,但第一个预测应该只匹配偶数个a
和c
s ,另一个预测只有偶数b
和d
s。如果你想要解释,看看塞巴斯蒂安的答案,并使用他的这个正则表达式的较短版本:
^(?=(?:(?:[ac]*[bd]){2})*[ac]*$)(?:(?:[bd]*[ac]){2})*[bd]*$
这样你就可以像这样简单地提取布尔值:
import re
my_string = "abcddcbccadacbac"
result = bool(re.search("^(?=(?:(?:[ac]*[bd]){2})*[ac]*$)(?:(?:[bd]*[ac]){2})*[bd]*$", my_string))
print(result) // True or False
答案 1 :(得分:3)
当然,这可以使用纯正则表达式来完成,尽管它并不是那么漂亮。只需使用前瞻来检查第二个条件和实际匹配。
^(?=(?:(?:[ac]*[bd]){2})*[ac]*$)(?:(?:[bd]*[ac]){2})*[bd]*$
(?=
启动前瞻(?:(?:[ac]*[bd]){2})*
寻找任意数量的a或c,然后是一个b或d - 两次,所以我们得到一个偶数 - 并且整个模式经常需要[ac]*
如果有,或者有一个或c,则匹配它们$
匹配字符串的结尾同样的逻辑,只是用切换的字母也用于匹配。
答案 2 :(得分:2)
这是一个简单的JS解决方案,您可以适应。
{{1}}