如何查找所有长度为5且将1位数字和4个字母划分为所有组组合的字符串

时间:2018-09-06 19:28:32

标签: python regex

我需要用正则表达式来计算所有长度为5的字符串组,这些字符串包含1位数字(0-9)和4个小写字母(a-z),内容如下:

  • 1位数字和所有字母不同
    例如:1abcd
  • 1位数字,两个字母相等,其余均不同
    例如:a2acd
  • 1位数字,等于3个字母,其余各不相同
    例如:aa3ad
  • 1位数字,等于4个字母
    例如:aa5aa
  • 1位数字,两个字母相等,其他两个字母相等
    例如:1aabb

我知道如何用字母和1位数字匹配所有长度为5的字符串:
^(?=.{5}$)[a-z]*(?:\d[a-z]*){1}$
Here是一个示例。

但是我不适合上述每个小组。
我读到第一个示例( 1位数字,所有字母都不同),我需要防止使用.*(.).*\1重复字符,但是我尝试了:

^(?=.{5}$)[a-z]*(?:\d[a-z]*)(.*(.).*\1){1}$  

它没有用。

1 个答案:

答案 0 :(得分: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']}