我正在尝试使用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 :(得分: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
字边界答案 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。