为包含每个字符至少一次的字符串查找更简单的Python RegEx

时间:2017-05-24 20:16:29

标签: python regex

我正在处理一个小项目,需要正则表达式接受包含给定字母中每个字符的字符串至少一次

因此,对于字母{J, K, L},我需要一个RegEx,它接受包含J一次或多次AND K一次或多次的字符串,并L一个或多个时间,任何顺序,任何数量的重复字符之前,之后或之间。

我对RegEx缺乏经验,所以很难找到"横向思维"许多问题的解决方案。因此,我的第一个方法是相当暴力:我采取了每一种可能的基础"字符串,例如,

JKL, JLK, KJL, KLJ, LKJ, LJK

并允许任何可以从其中一个起点构建的字符串。然而,由此产生的正则表达式*(尽管工作)最终会很长并且包含大量冗余。更不用说一旦字母表中有多个字符,这种方法就变得完全站不住脚了。

我花了几个小时试图找到一个更优雅的方法,但我还没有找到一个仍然接受所有可能的字符串。是否有一种方法或技术可以用更优雅和可扩展的方式(更大的字母表)来完成?

*作为参考,我列出的例子的正则表达式:

((J|K|L)*J(J|K|L)*K(J|K|L)*L(J|K|L)*)|
((J|K|L)*J(J|K|L)*L(J|K|L)*K(J|K|L)*)|
((J|K|L)*K(J|K|L)*J(J|K|L)*L(J|K|L)*)|
((J|K|L)*K(J|K|L)*L(J|K|L)*J(J|K|L)*)|
((J|K|L)*L(J|K|L)*J(J|K|L)*K(J|K|L)*)|
((J|K|L)*L(J|K|L)*K(J|K|L)*J(J|K|L)*)

2 个答案:

答案 0 :(得分:6)

这是前瞻的典型用例。您只需使用^(?=[^J]*J)(?=[^K]*K)(?=[^L]*L)检查所有条件即可。如果您的字符串也必须只包含这些字符,则可以将[JKL]+$附加到其中。

答案 1 :(得分:3)

如果不要求使用正则表达式,您还可以单独检查字符:

text = ...
alphabet = 'JKL'
assert all([character in text for character in alphabet])

或者,如果您不想允许不在字母表中的字符:

assert set(alphabet) == set(text)