Python正则表达式替代匹配

2024-04-26 05:51:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个变量包含几个数字。我想找出那些只包含两个或更多重复数字的数字。这是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,也就是说,只有当重复的数字出现在求偶时,匹配才会发生


Tags: inechoreenvbashforbinusr
3条回答
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)

在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

正则表达式详细信息:

  • ([0-9]):匹配一个数字并在组#1中捕获它
  • \1:返回对组#1的引用,以确保我们有一个数字的重复

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

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

1123456789
34312323445

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

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

(假设你不想把重复次数限制在10次,而只设为2次或更多)

相关问题 更多 >