簡體   English   中英

為包含至少每個字符的字符串找到一個更簡單的Python RegEx

[英]Finding a simpler Python RegEx for a string that contains each character at least once

我正在做一個小項目,需要正則表達式,該正則表達式至少接受一次包含給定字母每個字符的字符串。

因此,對於字母{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]+$

如果不需要使用正則表達式,則還可以單獨檢查字符:

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

或者,如果您不想允許字母以外的字符:

assert set(alphabet) == set(text)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM