Python正则表达式,删除重复的类

时间:2015-12-22 04:55:48

标签: python regex

我有一堆时间戳字符串。每个字符串有三个部分和部分之间的分隔符。分隔符可以是这些[。:,;]符号中的任何一个。每个部分都包含数字。第一个可能包含一个或两个数字。任何其他部分可能包含两位数字。我需要检索这些数字并用它们完成一些动作。我使用Python3。

所以我写这段代码:

import re
lines = ('1:24.15', '17.01.01', '05:07:28', '175.11.123', '4:35,07', '01;21;73', '00;1;1', '7;7.12')
pattern = re.compile(r'^(\d{1,2})[:.,;](\d{2})[:.,;](\d{2})$')
for i in lines:
    try:
        mm, ss, ff = pattern.search(i).groups()
    except AttributeError:
        print('{} is invalid'.format(i))
    print(int(mm) * 60 + int(ss) + round(int(ff) / 0.075 / 1000, 3))

我的问题是......我怎样才能减少这个正则表达式中的重复?

r'^(\d{1,2})[:.,;](\d{2})[:.,;](\d{2})$'

提前谢谢你。我会感激任何建议。

2 个答案:

答案 0 :(得分:1)

为什么不使用re.split()

pattern = re.compile(r"[.:;,]")
for line in lines:
    mm, ss, ff = pattern.split(line)

但是,这需要对mmssff进行额外的长度检查。一方面 - 这会降低吸引力,但这会导致更精确,更有意义的错误消息

pattern = re.compile(r"[.:;,]")
for line in lines:
    try:
        mm, ss, ff = pattern.split(line)
    except ValueError:
        print('{} has not enough digit groups'.format(line))
        continue

    if len(mm) not in (1, 2) or len(ss) != 2 or len(ff) != 2:
        print('{} has a digit group with invalid length'.format(line))
        continue

    print(int(mm) * 60 + int(ss) + round(int(ff) / 0.075 / 1000, 3))

答案 1 :(得分:0)

r'^(\d{1,2})([:.,;](\d{2})){2}$'

这应该尽可能紧凑。