【问题标题】:Finding specific pattern of numbers using regular expression in python在python中使用正则表达式查找特定的数字模式
【发布时间】:2019-08-01 18:33:01
【问题描述】:

我正在尝试使用 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'

【问题讨论】:

  • 了解你得到什么输出以及你期望什么会很有用。你会让其他人更容易帮助你。
  • 试试这个-0?\d{10}|0?\d{5}\s\d{5}。它将匹配所有 4 种模式。
  • 您的正则表达式不正确,因为它接受 01234 56789(模式 3)。对于不接受 0 的模式,您不能使用 \d。你必须使用 [123456789] !
  • @GulJamalZim 基本上有很多模式可以匹配这些数字,关键是要了解你想要匹配什么。
  • @GiovaLomba,我刚刚更新了我的问题以获得所需的输出。

标签: python regex python-3.x


【解决方案1】:

正则表达式101 (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']
[]
[]
[]
[]

【讨论】:

  • 谢谢@Andrej Kesely!我给出的示例仅用于代表性目的。对不起,如果它令人困惑。我的字符串中的数字可以是任何东西。示例:“2345653340”或“034945 85730”或“00000 00000”
  • @Code_Sipra 是的,正则表达式将匹配任何正确的数字。你可以在 Regex101 中尝试一下。 \d 代表任意数字 0-9
【解决方案2】:

您可以使用和交替来匹配不同的要求。您可以使用单词边界\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}模式31次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

【讨论】:

    【解决方案3】:

    在目前给出的所有正则表达式中,这个似乎是最容易编写和运行最快的

    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

    【讨论】:

    • 感谢@GiovaLomba。我相信我的问题有点误导。我只是添加了一个注释以避免混淆。提供的示例模式仅用于表示。我的字符串中的实际数字集可以是任何东西。示例:“2345653340”或“034945 85730”或“00000 00000”或“09876543210”。
    • @Code_Sipra 我看到了。感谢您的澄清!
    • 看起来这个实现对于“01111 67890”失败了。结果应该是一个空列表,因为它匹配模式 3 条件。
    • @Code_Sipra 你是对的,我更新了正则表达式,不包括前导零,并且该模式再次成为最有效的模式:)
    • @Thefourthbird 你是对的!事实上,我给出的所有链接都是根据 OP 给出的相同最小示例进行评估的。
    猜你喜欢
    • 2021-02-02
    • 1970-01-01
    • 2015-06-24
    • 1970-01-01
    • 2020-12-04
    • 2021-05-09
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多