我有一堆时间戳字符串。每个字符串有三个部分和部分之间的分隔符。分隔符可以是这些[。:,;]符号中的任何一个。每个部分都包含数字。第一个可能包含一个或两个数字。任何其他部分可能包含两位数字。我需要检索这些数字并用它们完成一些动作。我使用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})$'
提前谢谢你。我会感激任何建议。
答案 0 :(得分:1)
为什么不使用re.split()
:
pattern = re.compile(r"[.:;,]")
for line in lines:
mm, ss, ff = pattern.split(line)
但是,这需要对mm
,ss
和ff
进行额外的长度检查。一方面 - 这会降低吸引力,但这会导致更精确,更有意义的错误消息:
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}$'
这应该尽可能紧凑。