如何找到长度为5的所有字符串,并将1位数和4个字母分成所有组合

问题描述 投票:2回答:1

我需要正则表达式来计算长度为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}$  

它没用。

python regex
1个回答
2
投票

您可以使用:

/\b(?=[a-zA-Z]*\d[a-zA-Z]*)([a-zA-Z0-9]{5})/

Demo

添加第二个\b以拒绝超过5个字符的匹配字符串:

/\b(?=[a-zA-Z]*\d[a-zA-Z]*)([a-zA-Z0-9]{5}\b)/

Demo 2

如果您想限制为小写字母:

/\b(?=[a-z]*\d[a-z]*)([a-z0-9]{5}\b)/

由于四个字母的所有组合都是可能的,因此不需要进一步分类。所有相同,不同,有些相同。

如果您想对字母进行分类,只需在Python中捕获并添加所需的逻辑。


根据你的例子(说明这个问题的目标是什么和不匹配会有帮助):

/(?=^[a-z]*\d[a-z]*$)(^[a-z0-9]{5}$)/mg

Demo 3

然后,如果你想分组成组,我会在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']}
© www.soinside.com 2019 - 2024. All rights reserved.