从Python字符串中提取年份

7

我该如何在Python中解析以下内容以提取年份:

'years since 1250-01-01 0:0:0'

答案应该是1250。
3个回答

23

有许多方法可以做到这一点,以下是几个选项:

In [1]: s = 'years since 1250-01-01 0:0:0'

In [2]: from dateutil.parser import parse

In [3]: parse(s, fuzzy=True).year  # resulting year would be an integer
Out[3]: 1250
  • 带有捕获组的正则表达式:

  • In [2]: import re
    
    In [3]: re.search(r"years since (\d{4})", s).group(1)
    Out[3]: '1250'
    
  • 按“since”进行分割,然后再按破折号进行分割:

    In [2]: s.split("since", 1)[1].split("-", 1)[0].strip()
    Out[2]: '1250'
    
  • 或者甚至是通过第一个破折号进行分割,并切割第一个子字符串:

  • In [2]: s.split("-", 1)[0][-4:]
    Out[2]: '1250'
    

    根据输入字符串的可能变化情况,后两个涉及更多的“移动部件”,可能不适用。


    2
    不知道“模糊匹配”。很棒。 - wim
    2
    不错!我也不知道这个。 - idjaw

    5
    你可以使用一个正则表达式,围绕着四个数字设置捕获组,并确保你的特定模式也在其中。我可能会寻找以下一些内容:
    - 4个数字和一个捕获组 (\d{4}) - 连字符 - - 两个数字 \d{2} - 连字符 - - 两个数字 \d{2} 这将给出: (\d{4})-\d{2}-\d{2} 示例:
    >>> import re
    >>> d = re.findall('(\d{4})-\d{2}-\d{2}', 'years since 1250-01-01 0:0:0')
    >>> d
    ['1250']
    >>> d[0]
    '1250'
    

    如果你需要将它作为整数使用,只需将其强制转换为int类型即可:

    >>> int(d[0])
    1250
    

    你不需要在开头加上\s。 - kame

    2
    以下正则表达式应该将四位数年份作为第一个捕获组提取出来:
    ^.*\(d{4})-\d{2}-\d{2}.*$
    

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