在python中使用正则表达式查找数字的特定模式

时间:2019-08-01 18:33:01

标签: python regex python-3.x

我正在尝试使用Python 3.7中的正则表达式提取数字的特定模式。以下是4种可能的模式。

模式1-此模式的长度恰好是10,不能以零开头。这些仅由整数组成。例如:“ 1234567890”

模式2-此模式的长度恰好是11,可以从零开始。这些仅由整数组成。例如:“ 01234567890”

模式3-此模式的长度恰好是11,不能以零开头。第5个数字后面有一个空格,其他所有字符均为数字。例如:“ 12345 67890”

模式4-此模式的长度正好是12,可以从零开始。第6个数字后面有一个空格,其他所有字符均为数字。例如:“ 012345 67890”

注-提供的示例模式示例仅用于表示。字符串中的实际数字集可以是任何数字。例如:“ 2345653340”或“ 034945 85730”或“ 000000 00000”或“ 09876543210”。

以下是我一直在尝试的尝试。由于某些原因,他们没有返回期望的结果。我该怎么办?

import re

regex = re.compile(r"(\d)?\d\d\d\d\d(\b)?\d\d\d\d\d")

number1 = regex.findall("number is 1234567890") # For Pattern 1 expected output is '1234567890'
number2 = regex.findall("number is 01234567890") # For Pattern 2 expected output is '01234567890'
number3 = regex.findall("number is 12345 67890") # For Pattern 3 expected output is '12345 67890'
number4 = regex.findall("number is 012345 67890") # For Pattern 4 expected output is '012345 67890'

3 个答案:

答案 0 :(得分:1)

Regex101(link):

import re

l = ["number is 1234567890",
"number is 01234567890",
"number is 12345 67890",
"number is 012345 67890",

"number is 912345 67890 - dont match",
"number is 02345 67890 - dont match",
"number is 91234567890 - dont match",
"number is 0234567890 - dont match"]

for s in l:
    m = re.findall(r'\b0\d{5}\s\d{5}\b|\b[1-9]\d{4}\s\d{5}\b|\b0\d{10}\b|\b[1-9]\d{9}\b', s)
    print(m)

打印:

['1234567890']
['01234567890']
['12345 67890']
['012345 67890']
[]
[]
[]
[]

答案 1 :(得分:1)

您可以使用和交替来满足不同的要求。您可以使用单词边界\b来防止数字成为较大单词的一部分。

\b(?:\d{6} \d{5}|[1-9]\d{4} \d{5}|[1-9]\d{9}|\d{11})\b
  • \b单词边界
  • (?:非捕获组
    • \d{6} \d{5} 样式4 6遍0-9,空格5遍0-9
    • |
    • [1-9]\d{4} \d{5} 模式3 1次1-9,4次0-9,空格,5次0-9
    • |
    • [1-9]\d{9} 模式1 1遍1-9,9遍0-9
    • |
    • \d{11} 模式2 11遍0-9
  • )关闭群组
  • \b字边界

Regex demo | Python demo

答案 2 :(得分:1)

在现在给出的所有正则表达式之间,该正则表达式最容易编写且运行最快

from re import compile
regex = compile(r'\d{11}|[1-9]\d{9}|[1-9]\d{4}\s\d{5}|\d{6}\s\d{5}')
number1 = regex.findall("number is 1234567890")
number2 = regex.findall("number is 01234567890")
number3 = regex.findall("number is 12345 67890") 
number4 = regex.findall("number is 012345 67890")

您将获得预期的结果:

>>> number1
'1234567890'
>>> number2
'01234567890'
>>> number3
'12345 67890'
>>> number4
'012345 67890'

Andrej Kesely的答案是:80个步骤。 regex101.com
第四只鸟的回答是:44个步骤。 regex101.com
我的回答是:41个步骤。 regex101.com

相关问题