Python正则表达式替代匹配

时间:2019-09-07 13:54:47

标签: python regex bash

我有一个包含多个数字的变量。我想找到一个仅包含2个或多个重复数字的数字。这相当于bash:

#!/usr/bin/env bash

numbers="1123456789\n34312323445\n6564323243\n8975645345"

for i in $(echo -e $numbers); do
  echo $i | egrep '0{2,10}|1{2,10}|2{2,10}|3{2,10}|4{2,10}|5{2,10}|6{2,10}|7{2,10}|8{2,10}|9{2,10}'
done

我需要一个与上述bash代码等效的Python。我已经尝试了以下方法,但是无法正常工作:

#!/usr/bin/env python3

import re

numbers = [1123456789, 34312323445, 6564323243, 8975645345]

pattern = re.compile('0{2,10}|1{2,10}|2{2,10}|3{2,10}|4{2,10}|5{2,10}|6{2,10}|7{2,10}|8{2,10}|9{2,10}')

for i in numbers:
    if pattern.match(str(i)):
        print(i)

bash代码段同时匹配112345678934312323445,但是python代码段仅匹配11234567890,即,仅当重复的数字出现在数字的开头时才匹配。

3 个答案:

答案 0 :(得分:2)

import re

numbers = ["1123456789", "34312323445", "6564323243", "8975645345"]

pattern = r"((\d)\2+)"

for number in numbers:
    match = re.search(pattern, number)
    if match is not None:
        print(f"{number} has repeating digits ({match.group(1)})")

输出:

1123456789 has repeating digits (11)
34312323445 has repeating digits (44)

正则表达式模式的工作方式如下:

(\d)-这是第2组。它捕获一位数字。

\2+-尝试一次或多次匹配第2组中的任何内容。

为了方便起见,将整个内容包装在另一个组(第1组)中。

您还可以使用re.findall查找任何数字中的所有重复数字,而不仅仅是找到任何给定数字中的第一个匹配项:

import re

numbers = ["1123455556789", "34312323445", "6564323243", "8975645345"]

pattern = r"((\d)\2+)"

for number in numbers:
    for match_groups in re.findall(pattern, number):
        print(f"{number} has repeating digits ({match_groups[0]})")

输出:

1123455556789 has repeating digits (11)
1123455556789 has repeating digits (5555)
34312323445 has repeating digits (44)

答案 1 :(得分:1)

对于pattern,请尝试以下操作:

r".*(0{2,}|1{2,}|2{2,}|3{2,}|4{2,}|5{2,}|6{2,}|7{2,}|8{2,}|9{2,}).*"

(假设您不想将重复次数上限为10,而将重复次数限制为2或更多)

答案 2 :(得分:1)

在python中,您可以执行以下操作:

>>> numbers = [1123456789, 34312323445, 6564323243, 8975645345]
>>> reg = re.compile(r'([0-9])\1')
>>> for i in numbers:
...     if reg.search(str(i)):
...             print i
...
1123456789
34312323445

RegEx详细信息:

  • ([0-9]):匹配一个数字并将其捕获在#1组中
  • \1:向后引用第1组,以确保我们重复输入数字

您的bash代码也可以使用相同的捕获组和反向引用概念进行重构和简化:

numbers="1123456789\n34312323445\n6564323243\n8975645345"
printf '%b\n' "$numbers" | grep -E '([0-9])\1'

1123456789
34312323445
相关问题