Skip to main content
 首页 » 编程设计

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

2025年05月04日25davidwang456

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

所以对于字母表 {J, K, L} 我需要一个 RegEx 接受包含 J 一次或多次和 K 一次或多次,AND 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)*) 

请您参考如下方法:

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