我需要正则表达式来计算所有长度为 5 的字符串组,其中包含 1 个数字 (0-9
) 和 4 个小字母 (a-z
),如下所示:
- 1 位数字且所有字母均不同
例如:1abcd
- 1个数字,2个字母相等,其余不同
例如:a2acd
- 1个数字,3个字母相等,其余不同
例如:aa3ad
- 1个数字,4个字母相等
例如:aa5aa
- 1 个数字,2 个字母相等,另外两个不同的字母也相等
例如:1aabb
我知道如何匹配所有长度为 5 且包含字母和 1 数字的字符串:
^(?=.{5}$)[a-z]*(?:\d[a-z]*){1}$
Here就是一个例子。
但我不知道如何为上述每个组执行此操作。
我读到,对于第一个示例(1 位数字且所有字母都不同),我需要防止使用 .*(.).*\1
重复字符,但我尝试过:
^(?=.{5}$)[a-z]*(?:\d[a-z]*)(.*(.).*\1){1}$
没成功。
最佳答案
您可以使用:
/\b(?=[a-zA-Z]*\d[a-zA-Z]*)([a-zA-Z0-9]{5})/
添加第二个 \b
以拒绝长度超过 5 个字符的匹配字符串:
/\b(?=[a-zA-Z]*\d[a-zA-Z]*)([a-zA-Z0-9]{5}\b)/
如果您想限制为小写字母:
/\b(?=[a-z]*\d[a-z]*)([a-z0-9]{5}\b)/
由于这四个字母的所有组合都是可能的,因此不需要进一步分类。全部相同,全部不同,有些相同。
如果您确实想对字母进行分类,只需用 Python 捕获并添加所需的逻辑即可。
根据您的示例(说明什么与此问题的目标匹配或不匹配会很有帮助):
/(?=^[a-z]*\d[a-z]*$)(^[a-z0-9]{5}$)/mg
如果你想分组,我就用Python来做:
import re
st='''\
1aaaa
2aabb
jwzw3
jlwk6
bjkgp
5fm8s
x975t
k88q5
zl796
qm9hb
h6gtf
9rm9p'''
di={}
for m in re.finditer(r'(?=^[a-z]*\d[a-z]*$)(^[a-z0-9]{5}$)', st, re.M):
di.setdefault(len(set(m.group(1)))-1, []).append(m.group(1))
>>> di
{1: ['1aaaa'], 2: ['2aabb'], 3: ['jwzw3'], 4: ['jlwk6', 'qm9hb', 'h6gtf']}
关于python - 如何找到所有长度为5且有1个数字和4个字母的字符串分为所有组组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52210973/