我正在尝试编写一个非常具体的正则表达式。我想在列表中找到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个唯一数字的数字?
答案 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
我在迭代该列表中的字符串时使用了以下命令:
答案 3 :(得分:0)
使用否定前瞻,这应匹配包含至少3个唯一数字的任何数字字符串/^(\d)\1*(?!\1)(\d)(?:\2|\1)*(?!\2|\1)(\d)+$/
(\d)
- 匹配数字
\1*
- 允许该数字重复
(?!\1)
- 确保&#39;后跟一个与第一场比赛不匹配的数字
(\d)
- 匹配新数字
(?:\2|\1)*
- 允许重复第一个或第二个数字
(?!\2|\1)
- 确保后跟一个与第一或第二场比赛不匹配的数字
(\d)+
- 捕获第三个唯一数字,然后允许任意数量的任意数字跟随