Python:无法匹配的组异常。

3
我是一个有用的助手,可以翻译文本。

我有一个由时间组成的字符串,我想将这些时间格式化为12小时制。

我尝试过:

pat1 = "(\d+):(\d+)?\s*pm"
pat1 = "(\d+):(\d+)?\s*am"
hooString = "673 HOO: Mon. 7:30 am - 6pm, Tue. 7:30am - 6 pm, Wed. 7:30 am - 6 pm, Thurs. 7:30 am - 6 pm, Fri. 8 am - 5 pm,"
hooString  = sub(compile(pat1, IGNORECASE), "\1:\2 AM", hooString)
hooString  = sub(compile(pat2, IGNORECASE), "\1:\2 PM", hooString)
print hooString

我得到的输出是:
673 HOO: Mon. 7:30 AM - 6pm, Tue. 7:30 AM - 6 pm, Wed. 7:30 AM - 6 pm, Thurs. 7:30 AM - 6 pm, Fri. 8 am - 5 pm,

但我需要将“8am或8 am”也替换为“8 AM”,所以我稍微修改了正则表达式。
pat1 = "(\d+):?(\d+)?\s*am"
pat2 = "(\d+):?(\d+)?\s*pm"

它抛出了一个“未匹配的组”异常。因为第二个组在输入字符串中不存在。
我怎样才能在两种条件“%H:%M %P”和“%H %p”下获得我的预期结果而不出现异常呢?
而且,如果我能够将“8 am”的结果获得“8:00 AM”,那将是最好的答案。
1个回答

7

为什么一开始就要分成两组?

pat1 = r"(\d+(?:[:]\d+)?)\s*am"
pat1 = r"(\d+(?:[:]\d+)?)\s*pm"

请注意使用原始字符串。否则,您可能会遇到转义问题。
我做了什么?我只是将整个时间都放在一个组中,并使用非捕获组使“:\d+”变成可选项。替换当然是“\1 AM”和“\1 PM”。

谢谢,非常有效。有没有可能将5 AM更改为5:00 AM?也就是说,如果是整点,我想要分钟显示为00。 - Garfield
1
@flower 也许你可以再试一下。但是你不能有条件地让魔法字符只出现在替换字符串中。(或者你必须使用 re.sub 并带有替换回调函数) - Martin Ender
谢谢,我会应用替换回调函数。 - Garfield
@flower 注意,你可以将其简化为一个正则表达式:r"(\d+(?:[:]\d+)?)\s*([ap]m)" 并自动将第二个组转换为大写 - Martin Ender
有时候会出现a.m、p.m、a.m.、p.m.代替AM和PM的情况。 - Garfield
1
@flower 所以使用 r"(\d+(?:[:]\d+)?)\s*([ap][.]?m),对吧?你可以在回调函数中完成所有的清理工作。 - Martin Ender

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