我有任务要完成。我有它的测试文件,其中包含代码:
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>"
请解释一下我的代码有什么问题以及如何修复它。
答案 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
字符串。