【问题标题】:Python Regular Expressions to extract datePython正则表达式提取日期
【发布时间】:2011-06-29 17:33:38
【问题描述】:

我的字符串如下所示:

{server}_{date:YYYYMMDD}{int:######}
{server}_{date:MON DAY YYYY}{int:######}

...还有更多,以不同的日期格式。此外,可以有任意数量的 {} 块,并且它们可以以任意顺序出现。

我试图在 Python 3.2 中仅获取大括号之间的“日期”部分。因此,对于第一个字符串,我只想获得“{date:YYYYMMDD}”,而对于第二个字符串,我只想获得“{date:MON DAY YYYY}”。我想要在“日期”块中的唯一字符是字母和空格。

我的正则表达式模式是:

\{date:(\w|\s)*\}

我已在 this Regex builder 上对此进行了测试,但与预期的不匹配。这是我在 Python 上的输出:

>>> import re
>>> re.findall('\{date:(\w|\s)*\}', '{server}_{date:YYYYMMDD}{date:MONDAYYYYY}{int:######}')
['D', 'Y']
>>> re.findall('\{date:(\w|\s)*\}', '{server}_{date:MON DAY YYYY}{int:######}')
['Y']

谁能指出我的模式有什么问题?

【问题讨论】:

  • 感谢您的所有回答!现在看看每个人的答案,很明显我在我的问题中遗漏了重要的细节。我编辑了我的帖子并添加了更多细节。

标签: python regex


【解决方案1】:

'(\{date:[\w\s]+\})' 给出你想要的:

>>> import re
>>> re.findall('(\{date:[\w\s]+\})', '{server}_{date:YYYYMMDD}{date:MONDAYYYYY}{int:######}')
['{date:YYYYMMDD}', '{date:MONDAYYYYY}']
>>> re.findall('(\{date:[\w\s]+\})', '{server}_{date:MON DAY YYYY}{int:######}')
['{date:MON DAY YYYY}']

如果您只想要数据值,请使用'\{date:([\w\s]+)\}'

【讨论】:

    【解决方案2】:
    >>> re.findall('\{date:([\w\s]*)\}', '{server}_{date:YYYYMMDD}{date:MONDAYYYYY}{int:######}')
    ['YYYYMMDD', 'MONDAYYYYY']
    

    【讨论】:

      【解决方案3】:

      试试这个

      str = '{server}_{date:MON DAY YYYY}{int:######}'
      re.findall('\{date:.*\}(?=\{)',str)
      

      它返回这个

      ['{date:MON DAY YYYY}']
      

      str = '{server}_{date:YYYYMMDD}{int:######}'
      re.findall('\{date:.*\}(?=\{)',str)
      

      返回以下内容:

      ['{日期:YYYYMMDD}']

      (?=..\{) 执行以下操作:

      (?=...) 匹配 if ... 匹配下一个,但不使用任何字符串。这称为前瞻断言。例如,Isaac (?=Asimov) 只有在 'Asimov' 之后才会匹配 'Isaac'。(source)

      注意: 这只有在 {date} 之后的另一个块 {..} 才会起作用,我认为这是必要的,如果它丢失,您的输入可能无效。

      【讨论】:

      • 我应该提到可以有任意数量的 {} 块,它们可以以任意顺序出现。我的不好,我的问题不够详细。不过我很感激这个答案。
      • 好吧,只要后面有另一个块,它仍然会找到以{date:.*] 开头的块。
      【解决方案4】:
      '{server}_({date:.+?}){int:'
      

      够了

      .

      或者,可能更好

      '(?<={server}_)({date:.+?})(?={int:)'
      

      【讨论】:

        【解决方案5】:

        在整个正则表达式周围使用一个捕获组,为(\w|\s) 部分使用一个非捕获组:

        (\{date:(?:\w|\s)*\})

        这将产生你想要的输出:

        >>> re.findall('(\{date:(?:\w|\s)*\})', '{server}_{date:MON DAY YYYY}{int:######}')
        ['{date:MON DAY YYYY}']
        >>> re.findall('(\{date:(?:\w|\s)*\})', '{server}_{date:YYYYMMDD}{date:MONDAYYYYY}{int:######}')
        ['{date:YYYYMMDD}', '{date:MONDAYYYYY}']
        

        【讨论】:

        • 如果您使用非捕获组,实际上不需要在整个正则表达式周围放置括号。 '\{date:(?:\w|\s)*\}' 生成相同的结果。
        猜你喜欢
        • 2017-05-13
        • 2019-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-21
        • 1970-01-01
        • 2012-06-20
        相关资源
        最近更新 更多