使用Python正则表达式提取日期
我有一些字符串,看起来像这样:
{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]+)\}'
。