我正在处理一个小项目,需要正则表达式接受包含给定字母中每个字符的字符串至少一次。
因此,对于字母{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)*)
答案 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)