将bash脚本转换为python的问题

时间:2018-06-23 18:57:17

标签: python regex bash

我在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中的值并将其转换为秒。

1 个答案:

答案 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锚点。