构建正则表达式,12个字母无序,固定数量的单个字母
Building a RegEx, 12 letters without order, fixed number of individual letters
我有一个复杂的案例,我无法进一步了解。目标是通过 RegEx 检查字符串是否满足以下条件:
- 恰好 12 个字母
- 字母 W、S、I、O、B、A、R 和 H 只能在字符串中出现一次
- 字母 T 和 E 只能在字符串中恰好出现 2 次。
- 重要!顺序必须无关紧要
匹配示例:
- WSITTOBAEERH
- HREEABOTTISW
- WSITOTBAEREH
我的第一次尝试:
results = re.match(r"^W{1}S{1}I{1}T{2}O{1}B{1}A{1}E{2}R{1}H{1}$", word)
第一次尝试的问题在于它仅在遵循 RegEx 中的字母顺序时才匹配。这违反了条件 4
我的第二次尝试:
results = re.match(r"^[W{1}S{1}I{1}T{2}O{1}B{1}A{1}E{2}R{1}H{1}]{12}$", word)
试验二的问题:现在顺序不再重要,但忽略了单个字母的确切数量。
到目前为止,我只能做 RegEx 的基础知识,不能再深入了。如果有人知道符合上述四个规则的正则表达式是什么样的,我将不胜感激。
一种可能,虽然我仍然认为正则表达式不适合这个。检查所有字母是否都出现了所需的数量,并且总共有 12 个字母(因此没有空间容纳任何 more/other 个字母):
import re
for s in 'WSITTOBAEERH', 'HREEABOTTISW', 'WSITOTBAEREH':
print(re.fullmatch('(?=.*W)(?=.*S)(?=.*I)(?=.*O)'
'(?=.*B)(?=.*A)(?=.*R)(?=.*H)'
'(?=.*T.*T)(?=.*E.*E).{12}', s))
另一个,检查除 T 和 E 之外的 none 出现两次,none 出现三次,并且我们只有所需的字母,总共 12 个:
import re
for s in 'WSITTOBAEERH', 'HREEABOTTISW', 'WSITOTBAEREH':
print(re.fullmatch(r'(?!.*([^TE]).*)'
r'(?!.*(.).*.*)'
r'[WSIOBARHTE]{12}', s))
更简单的方法:
for s in 'WSITTOBAEERH', 'HREEABOTTISW', 'WSITOTBAEREH':
print(sorted(s) == sorted('WSIOBARHTTEE'))
我有一个复杂的案例,我无法进一步了解。目标是通过 RegEx 检查字符串是否满足以下条件:
- 恰好 12 个字母
- 字母 W、S、I、O、B、A、R 和 H 只能在字符串中出现一次
- 字母 T 和 E 只能在字符串中恰好出现 2 次。
- 重要!顺序必须无关紧要
匹配示例:
- WSITTOBAEERH
- HREEABOTTISW
- WSITOTBAEREH
我的第一次尝试:
results = re.match(r"^W{1}S{1}I{1}T{2}O{1}B{1}A{1}E{2}R{1}H{1}$", word)
第一次尝试的问题在于它仅在遵循 RegEx 中的字母顺序时才匹配。这违反了条件 4
我的第二次尝试:
results = re.match(r"^[W{1}S{1}I{1}T{2}O{1}B{1}A{1}E{2}R{1}H{1}]{12}$", word)
试验二的问题:现在顺序不再重要,但忽略了单个字母的确切数量。
到目前为止,我只能做 RegEx 的基础知识,不能再深入了。如果有人知道符合上述四个规则的正则表达式是什么样的,我将不胜感激。
一种可能,虽然我仍然认为正则表达式不适合这个。检查所有字母是否都出现了所需的数量,并且总共有 12 个字母(因此没有空间容纳任何 more/other 个字母):
import re
for s in 'WSITTOBAEERH', 'HREEABOTTISW', 'WSITOTBAEREH':
print(re.fullmatch('(?=.*W)(?=.*S)(?=.*I)(?=.*O)'
'(?=.*B)(?=.*A)(?=.*R)(?=.*H)'
'(?=.*T.*T)(?=.*E.*E).{12}', s))
另一个,检查除 T 和 E 之外的 none 出现两次,none 出现三次,并且我们只有所需的字母,总共 12 个:
import re
for s in 'WSITTOBAEERH', 'HREEABOTTISW', 'WSITOTBAEREH':
print(re.fullmatch(r'(?!.*([^TE]).*)'
r'(?!.*(.).*.*)'
r'[WSIOBARHTE]{12}', s))
更简单的方法:
for s in 'WSITTOBAEERH', 'HREEABOTTISW', 'WSITOTBAEREH':
print(sorted(s) == sorted('WSIOBARHTTEE'))