Python中用于数字范围的正则表达式

3
我需要找到格式为“数字-数字”的数值范围。数字应在0-3000的范围内。因此,我提出了以下正则表达式:
match = re.search(r'^[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]-[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]',sentence)

当我运行程序时,我只想从句子中提取56-900,但程序还提取了其他数字,如2016、CLP2012等。我想要提取只有"-"连接的数字。我的模式有什么问题。

你应该使用"[0-9]+-[0-9]+" - Carles Mitjans
| 运算符的优先级最低,因此即使是 [1-9][0-9] 也是一个被接受的模式:你应该在连字符前后括起来。此外,可能存在更紧凑的表达方式。 - rrobby86
为什么不使用"[123]\d{0,3}"(或者"[0-3]\d{0,3}"来包括0)? - user2314737
3个回答

5

使用Python包regex_engine生成数字范围的正则表达式

您可以使用pip安装此软件包。

pip install regex-engine

from regex_engine import generator

generate = generator()

regex = generate.numerical_range(0,3000)

print(regex)

可以生成浮点数和负数范围的正则表达式

^([0-9]|[2-8][0-9]|1[0-9]|9[0-9]|[2-8][0-9][0-9]|1[1-9][0-9]|10[0-9]|9[0-8][0-9]|99[0-9]|[2-2][0-9][0-9][0-9]|1[1-9][0-9][0-9]|10[1-9][0-9]|100[0-9]|300[0-0])$

from regex_engine import generator

generate = generator()

regex1 = generate.numerical_range(5,89)
regex2 = generate.numerical_range(81.78,250.23)
regex3 = generate.numerical_range(-65,12)

1
奇怪的包。它运行得非常好,但由于某种原因,在开头和结尾添加了“^”和“$”,导致Python的“re.search”在子字符串上失败... - Ufos
1
你可以使用replace()方法来移除它们。 - Travis Mitchell

1
如果您想匹配整数范围,需要使用 r"\b"(字符串开始/结束)来保护匹配:
>>> import re

>>> text = "2016, CLP2012 56-900 3000-3000 4000-4000 123-123 0-0"
>>> re.findall(r"\b\d+-\d+\b", text)
['56-900', '3000-3000', '4000-4000', '123-123', '0-0']

如果你想匹配0到3000之间的整数,你需要使用更精确的正则表达式,就像这样:
>>> r = r"(?:3000|[1-2]\d{3}|[1-9]\d{2}|[1-9]\d|\d)"
>>> re.findall(r"\b" + r + "-" + r + r"\b", text)
['56-900', '3000-3000', '123-123', '0-0']

我认为使用'^'表示开头,'$'表示结尾更好。 - scriptboy
@scriptboy:不,^(或$)表示字符串的“开头”(或“结尾”),而不是“单词”的“开头”(或“结尾”)(这可以通过\w+匹配)。 - Laurent LAPORTE

0

这段代码仅提取真实范围 x-yx< y <= 3000

sentence = 'test 69 example 55-66 example 77-44 example 999-3001 example'

for word in re.findall('\d+-\d+', sentence):
    l = word.split('-')
    if int(l[0])< int(l[1]) <= 3000:
        word

此示例的输出:

'55-66'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接