使用所有可能的组合,以4个字长精确匹配3个字符

时间:2019-04-27 09:24:20

标签: regex

在以下单词列表中

ABCD
AAAA
AAAD
AAAB
BBDA
CCCC
CCCA
DADA
BABC

...
all possible 256 combinations

使用regrex,我要选择具有我的模式A或B的单词,它们的任何组合都覆盖4个准确的3个位置。

预期输出:

AAAD
BBDA
BABC

我知道使用 [AB] {4} ,我可以匹配整个世界,但条件搜索的准确位置是4个位置中的3个,会造成混乱。

4 个答案:

答案 0 :(得分:4)

只需重新措辞并确认您说的匹配规则,以便我的解决方案坚持下去,

  • 四分之三的职位应由AB占据
  • CD仅保留一个职位

如果正确,则可以使用此正则表达式匹配所需的字符串。

^(?=[AB]*[CD][AB]*$).{4}$

上述正则表达式的解释:

  • ^-字符串的开头
  • (?=[AB]*[CD][AB]*$)-前瞻性地确保CD在字符串中仅出现一次,因此其他三个位置被A和{{1}占据} s
  • B-使用点捕获四个字母.{4}$A,因为它们已经被正面肯定地验证为DA

Regex Demo

这里是 regulex graph ,可以提供更好的可视化效果

enter image description here

编辑: D

的详细说明

positive look ahead被写为(?=[AB]*[CD][AB]*$),与正常的正则表达式匹配和使用相反,环顾四周(正向/负向超前/向后看)仅匹配字符而不会消耗它们,这意味着环顾表达式结束后,将正则表达式标记重置为环顾开始匹配之前的位置。在此正则表达式中,我们用(?=some regex)作为表达式,其中[AB]*[CD][AB]*$表示它将匹配集合([AB]*A)中的任何字符零次或多次,然后是{ {1}}表示它需要与B[CD]的字符集中的一个字符完全匹配(因为这里没有量词),并且C再匹配任何一个字符{ {1}}或D零次或多次,最后确保到达字符串的结尾,因为它具有[AB]*

总而言之,该表达式的逻辑含义是,AB会出现一次,而它可能会被$或{{1}包围}根据需要在任一侧上形成四个字母,以匹配仅出现CD的四个字母的所有组合。

此外,revo并入了建议,其中A可以更改为B,这要感谢Revo。

答案 1 :(得分:2)

这可以做到:

^([^AB][AB]{3}|[AB][^AB][AB]{2}|[AB]{2}[^AB][AB]|[AB]{3}[^AB])$

答案 2 :(得分:2)

如果我的理解正确,您希望匹配所有具有三个完全相同的字符的字符串,即AB。这意味着该字符串将仅具有一个不是AB的字符。

您可以通过替换字符串中的所有As和B,然后检查剩余的字符串是否仅为一个字符来做到这一点:

for string in all_your_strings:
    if len(re.sub(r"[AB]", "", string)) == 1:
        # match!
    else:
        # not match

答案 3 :(得分:2)

尝试以下正则表达式:

^([^AB\r\n]*[AB]){3}(?!(?1)).*$

请参见live demo here

如果引擎中不支持递归((?1)集群),那么您可以使用它:

^(?:[^AB\r\n]*[AB]){3}(?![^AB\r\n]*[AB]).*$

请参见live demo here