我有一个包含多个数字的变量。我想找到一个仅包含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代码段同时匹配1123456789
和34312323445
,但是python代码段仅匹配11234567890
,即,仅当重复的数字出现在数字的开头时才匹配。
答案 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