我在shell中有以下代码:
case ${daterange} in
*[Mm][Oo]*)
factor=2592000
;;
*[Ww]*)
factor=604800
;;
*[Dd]*)
factor=86400
;;
*[Hh]*)
factor=3600
;;
*)
factor=60
;;
esac
num=`expr x"$TMFR" : x"[^0-9]*\([0-9]*\)"`
expr 0$num \* $factor
我写了下面的代码将其转换为python,但是卡住的是num=
和expr
行。我不知道如何将它们转移到python。
if re.search(r'[Mm][Oo]', daterange):
print "A"
elif re.search(r'[Ww]', daterange):
print "B"
elif re.search(r'[Dd]', daterange):
print "C"
elif re.search(r'[Hh]', daterange):
print "D"
elif re.search(r'[Mm]', daterange):
print "E"
else:
print "F"
daterange
可以包含以下值:
4h = which means 4 hours
4mo = which means 4 months
4w = which means 4 weeks
4d = which means 4 days
4m = which means 4 minutes
4s = which means 4 seconds
此处的目标是获取daterange
中的值并将其转换为秒。
答案 0 :(得分:1)
expr
执行表达式:
expr x"$TMFR" : x"[^0-9]*\([0-9]*\)"
与字符串x
匹配,后跟$TMFR
的值与正则表达式x[^0-9]*([0-9]*)
匹配,打印出括号之间的部分(为了避免它们而进行了转义)而不是被bash解释)。expr 0$num \* $factor
用数字$num
乘以$factor
,默认为0。因此,它基本上会在字符串$TMFR
中找到第一个数字值,然后将该数字乘以已经计算出的因子。
如果您总是有一个数字,然后是一个持续时间字符串,那么我只需要使用一个正则表达式一次性提取两者,然后使用字典将持续时间字符串映射到一个因子:
import re
durations = {
'mo': 2592000,
'w': 604800,
'd': 86400,
'h': 3600,
'm': 60,
's': 1
}
# match on digits followed directly by one of the duration strings, ignoring case
# the duration strings are sorted by descending length to ensure shorter
# sub-patterns are considered after the longer options (compare 'mo' and m')
pattern = re.compile(r'(\d+)({})\b'.format(
'|'.join(sorted(durations, key=len, reverse=True))),
flags=re.IGNORECASE)
def duration_from_string(s):
return sum(
int(m.group(1)) * durations[m.group(2)]
for m in pattern.finditer(s))
我假设您需要支持以空格分隔的复合持续时间,因此1mo 2w 3d
是4060800秒(1个月,2周和3天):
>>> duration_from_string('foo bar spam 1mo 2w 3d')
4060800
如果该格式也应在无空格的情况下使用,请从正则表达式模式中删除\b
锚点。