Python正则表达式搜索数字范围

12

我好像找不到关于这个问题的线程,但这应该是相当简单的事情。我正在尝试使用正则表达式在输出中搜索0-99之间的数字,并执行某个操作,但如果数字是100,则会执行不同的操作。这是我尝试过的代码(简化版):

OUTPUT = #Some command that will store the output in variable OUTPUT
OUTPUT = OUTPUT.split('\n')
for line in OUTPUT:
    if (re.search(r"Rebuild status:  percentage_complete", line)): #searches for the line, regardless of number
        if (re.search("\d[0-99]", line)): #if any number between 0 and 99 is found
            print("error")
        if (re.search("100", line)): #if number 100 is found
            print("complete")

我已经尝试过这个,但它仍然捕捉到100并打印错误。

3个回答

11

这个表达式: \d[0-99] 表示一个数字 (\d), 接着是一个数字范围 (0-9) 或者数字 9。如果你要匹配数字范围 [0-99],你需要使用类似于 \b\d{1,2}\b 的表达式。这将会匹配任何由 1 或 2 个数字组成的数值。


是的,我也尝试过了,但是当它发现100时仍会打印出错误。 - bladexeon
3
问题在于 100 在技术上是该正则表达式的一个有效匹配项(它会匹配值 10)。我已经修正了正则表达式,加入了单词边界符(\b),以解决这个问题。 - npinti
你的方法最有道理,但我无法使边界起作用。所以我做了这个: if re.search("\d{1,2}", line) and not re.search("100", line):这似乎有效。感谢您的帮助! - bladexeon
1
@bladexeon:如果是这样的话,我建议采用 PM 2Ring 的建议。 - npinti

4
您可以通过重新排列数字测试以及在2位数测试上使用elif而不是if,简化您的正则表达式。
for line in output:
    if re.search("Rebuild status:  percentage_complete", line): 
        if re.search("100", line):
            print "complete"
        elif re.search(r"\d{1,2}", line): 
            print "error"

只有在“100”的测试失败时,才会执行对两位数的测试。

在Python 2中,使用原始字符串r"\d{1,2}"并不是必须的,但对于任何包含反斜杠的正则表达式,使用原始字符串是一个好习惯。在Python 3中,您必须使用原始字符串,否则会出现以下错误:

DeprecationWarning: invalid escape sequence '\d'

请注意,在Python中,您不需要在条件周围加上括号,因此使用它们只会增加不必要的混乱。
正如dawg在评论中提到的那样,“100”的测试可以收紧为re.search(r"\b100\b", line),但如果我们可以保证我们只测试0-100范围内的整数百分比,则不需要这样做。

你的方法让我想到了另一种:匹配\d+。将匹配的组转换为int并进行数字比较,而不是使用正则表达式进行比较。它利用正则表达式的优点,但将数字视为数字而不是文本。 - Steven Rumbalski
@StevenRumbalski:我想这样做会更有效率,因为它减少了正则表达式搜索的数量。另一方面,我们可以使用简单的 str.find("100") 来替换对 "100" 的搜索... - PM 2Ring
请注意,re.search("100", line) 会匹配 1000, -100, 100.5 等。应该用 re.search(r"\b100\b", line) - dawg
@dawg:说得好,但我有点懒,因为这些数字是百分比,所以那些可能性不会发生。 - PM 2Ring

1

0 - 99:

>>> s='\n'.join(["line {} text".format(i) for i in range(-2,101) ])
>>> import re
>>> re.findall(r'(?<!\-)\b(\d\d|\d)\b', s)
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99']

正则表达式'(?<!\-)\b(\d\d|\d)\b'匹配0-99的2位数字,不匹配负数如-9

演示

100很容易:'(?<!\-)\b100\b'

如果您不想匹配浮点数:\b(?<![-.])(\d\d|\d)(?!\.)\b

演示


是否有任何与数字0-199相似简单的匹配? - dgrigonis

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