在以下单词列表中
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个,会造成混乱。
答案 0 :(得分:4)
只需重新措辞并确认您说的匹配规则,以便我的解决方案坚持下去,
A
和B
占据C
或D
仅保留一个职位如果正确,则可以使用此正则表达式匹配所需的字符串。
^(?=[AB]*[CD][AB]*$).{4}$
上述正则表达式的解释:
^
-字符串的开头(?=[AB]*[CD][AB]*$)
-前瞻性地确保C
或D
在字符串中仅出现一次,因此其他三个位置被A
和{{1}占据} s B
-使用点捕获四个字母.{4}$
至A
,因为它们已经被正面肯定地验证为D
至A
。这里是 regulex graph ,可以提供更好的可视化效果
编辑:
D
positive look ahead被写为(?=[AB]*[CD][AB]*$)
,与正常的正则表达式匹配和使用相反,环顾四周(正向/负向超前/向后看)仅匹配字符而不会消耗它们,这意味着环顾表达式结束后,将正则表达式标记重置为环顾开始匹配之前的位置。在此正则表达式中,我们用(?=some regex)
作为表达式,其中[AB]*[CD][AB]*$
表示它将匹配集合([AB]*
或A
)中的任何字符零次或多次,然后是{ {1}}表示它需要与B
或[CD]
的字符集中的一个字符完全匹配(因为这里没有量词),并且C
再匹配任何一个字符{ {1}}或D
零次或多次,最后确保到达字符串的结尾,因为它具有[AB]*
。
总而言之,该表达式的逻辑含义是,A
或B
会出现一次,而它可能会被$
或{{1}包围}根据需要在任一侧上形成四个字母,以匹配仅出现C
或D
的四个字母的所有组合。
此外,revo并入了建议,其中A
可以更改为B
,这要感谢Revo。
答案 1 :(得分:2)
这可以做到:
^([^AB][AB]{3}|[AB][^AB][AB]{2}|[AB]{2}[^AB][AB]|[AB]{3}[^AB])$
答案 2 :(得分:2)
如果我的理解正确,您希望匹配所有具有三个完全相同的字符的字符串,即A
或B
。这意味着该字符串将仅具有一个不是A
或B
的字符。
您可以通过替换字符串中的所有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)).*$
如果引擎中不支持递归((?1)
集群),那么您可以使用它:
^(?:[^AB\r\n]*[AB]){3}(?![^AB\r\n]*[AB]).*$