通过正则表达式从字符串中获取分钟数

时间:2014-12-25 18:44:39

标签: python regex

我有任务要完成。我有它的测试文件,其中包含代码:

import unittest
from Task302 import extract_minutes

class Task302Test(unittest.TestCase):
    """Testy do zadania 302"""

    def test_simple(self):
        """Prosty test."""
        self.assertEqual(extract_minutes("9:13"), "13")
        self.assertEqual(extract_minutes("18:44"), "44")
        self.assertEqual(extract_minutes("23:59"), "59")
        self.assertEqual(extract_minutes("0:00"), "00")
        self.assertEqual(extract_minutes("25:14"), "<NONE>")
        self.assertEqual(extract_minutes("9:61"), "<NONE>")
        self.assertEqual(extract_minutes("x9:13y"), "<NONE>")

我写了代码:

def extract_minutes(string):
    pattern = '[0-1]*[0-9]+|2[0-3]:([0-5][0-9])'
    r = re.compile(pattern)
    m = r.search(string)
    if m:
        return m.group(1)
    else:
        return "<NONE>"

请解释一下我的代码有什么问题以及如何修复它。

1 个答案:

答案 0 :(得分:2)

您需要将|运算符仅用于小时。你的正则表达式[0-1]*[0-9]+|2[0-3]:([0-5][0-9])认为从0到19的小时是单独的部分,小时从20到23加上作为单独部分的分钟。此外,我建议您将?代替*,因为*将匹配前一个令牌零次或多次,其中?(非贪婪量词除外) )将匹配前一个令牌0或1次。并且您必须在字符类+之后删除[0-9],因为+与之前的标记匹配一次或多次。

pattern = r'\b(?:[0-1]?[0-9]|2[0-3]):([0-5][0-9])\b'

\b称为单词边界,它在单词字符和非单词字符之间匹配。没有单词边界,它将匹配此x9:13y字符串。

DEMO