使用Python正则表达式提取日期

5 投票
5 回答
3527 浏览
提问于 2025-04-16 20:32

我有一些字符串,看起来像这样:

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

...还有更多,格式各异的日期。此外,里面可能有任意数量的{}块,并且它们可以以任何顺序出现。

我想在Python 3.2中提取出大括号中的“日期”部分。所以对于第一个字符串,我只想得到"{date:YYYYMMDD}",而对于第二个字符串,我只想得到"{date:MON DAY YYYY}"。我希望“日期”块里面只包含字母和空格。

我使用的正则表达式模式是:

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

我在这个正则表达式构建器上测试过,但结果没有按预期匹配。这是我在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']

有人能告诉我我的模式哪里出错了吗?

5 个回答

1

试试这个

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

它会返回这个

['{date:MON DAY YYYY}']

然后

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

返回以下内容:

['{date:YYYYMMDD}']

这里的 (?=..\{) 是这样工作的:

(?=...) 如果后面的内容能匹配,就会匹配这个,但不会消耗任何字符串。这叫做前瞻断言。举个例子,'Isaac (?=Asimov)' 只有在后面跟着 'Asimov' 的时候才会匹配 'Isaac '。(来源)

注意: 只有在 {date} 后面有另一个块 {..} 的情况下,这个才会起作用。我认为这是必要的,如果缺少这个,你的输入可能会无效。

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

当然可以!请把你想要翻译的内容发给我,我会帮你把它变得更简单易懂。

5

这个 '(\{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]+)\}'

撰写回答