如何在一串数字中找到3个UNIQUE数字?

时间:2016-05-31 17:25:38

标签: regex

我正在尝试编写一个非常具体的正则表达式。我想在列表中找到3位数。问题来了,因为我不关心重复数字(5,555和55555555555555被视为5)。此外,在3位数字内,它们需要3个不同的数字(123 =好,311 =坏)。 这是我到目前为止找到3位数,忽略重复但它没有指定3个唯一数字。

^(?:([0]{1,}|[1]{1,}|[2]{1,}|[3]{1,}|[4]{1,}|[5]{1,}|[6]{1,}|[7]{1,}|[8]{1,}|[9]{1,}|[0]{1,})(?!.*\\1)){3}$<p>

以下是我看到的数据类型示例。

匹配

458
3333335555111
2222555111
222255558888
111147
9533333333

不匹配:

999999999
222252
888887

现在我的正则表达式会找到所有这些。如何忽略任何没有3个唯一数字的数字?

4 个答案:

答案 0 :(得分:0)

我不确定awk脚本是否会为您执行此操作,但在此处:

 awk '
     function match_func(num) {
         if (match_array[num] == 0)
             match_array[num] = 1;
     }
     {
         for (i = 0; i < length($1); i++)
             match_func(substr($1, i, 1));
         for (i = 0; i < 10; i++)
             if (match_array[i] == 1) match_sum++;
         if (match_sum == 3)
             print $1;
     }'

答案 1 :(得分:0)

如果你选择的正则表达式工具支持后视,后引用和后续匹配,你可以使用

^(\d)\1*+(?!.*\1)(\d)\2*+(\d)\3*+$
  • ^$是确保我们检查整个字符串的锚点
  • (\d)将数字与第一个捕获组匹配,\1*+我们将此数字的任何后续出现匹配,并使用lookbehind (?!.*\1)确保它不会结束那个号码。
  • (\d)\2*+然后匹配下一个不同的数字,再次匹配任何后续出现(检查122没有相关的匹配,看看,为什么我在这里使用它)
  • (\d)\3*+匹配最后一位数字以及后续出现的任何内容。

如果没有广泛的匹配,你可以更多地使用后视,例如^(\d)\1*(?!.*\1)(\d)\2*(?!.*\2)(\d)\3*+$

请参阅https://regex101.com/r/pV2tB2/2了解演示。

网站注意:正则表达式可能不是最好的,但正如您特别要求的那样 - 在这里。

答案 2 :(得分:0)

这可以通过regex来完成,但它不是您工作的最佳工具。

您可以使用regex-only approach轻松实现此目的,而不是Python

示例

strings = ['458', '3333335555111', '2222555111', '222255558888', '111147', '9533333333', '955555555', '12222211']

for s in strings:
    if len(set(list(s))) == 3:
        print "Ok :", s
    else:
        print "Error :", s

输出:

>> Ok : 458
>> Ok : 3333335555111
>> Ok : 2222555111
>> Ok : 222255558888
>> Ok : 111147
>> Ok : 9533333333
>> Error : 955555555
>> Error : 12222211

我在迭代该列表中的字符串时使用了以下命令:

list()

set()

len()

答案 3 :(得分:0)

使用否定前瞻,这应匹配包含至少3个唯一数字的任何数字字符串/^(\d)\1*(?!\1)(\d)(?:\2|\1)*(?!\2|\1)(\d)+$/

(\d) - 匹配数字

\1* - 允许该数字重复

(?!\1) - 确保&#39;后跟一个与第一场比赛不匹配的数字

(\d) - 匹配新数字

(?:\2|\1)* - 允许重复第一个或第二个数字

(?!\2|\1) - 确保后跟一个与第一或第二场比赛不匹配的数字

(\d)+ - 捕获第三个唯一数字,然后允许任意数量的任意数字跟随