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

时间:2017-07-30 02:25:08

标签: regex

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

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

  • ' a'的总和数量和' c'甚至是
  • ' b'的总和数量并且' 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)

任何帮助?

3 个答案:

答案 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

因为这个正则表达式太过宽松,我不打算在这里详细说明,但第一个预测应该只匹配偶数个ac s ,另一个预测只有偶数bd 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,则匹配它们
  • $匹配字符串的结尾

同样的逻辑,只是用切换的字母也用于匹配。

请参阅https://regex101.com/r/DnWAF6/1

答案 2 :(得分:2)

这是一个简单的JS解决方案,您可以适应。



{{1}}