Python正则表达式提取日期

时间:2011-06-29 17:33:38

标签: python regex

我的字符串看起来像这样:

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

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

我试图在Python 3.2中使用花括号之间的“日期”部分。所以对于第一个字符串,我想得到“{date:YYYYMMDD}”,对于第二个字符串,我只想要“{date:MON DAY YYYY}”。 “日期”块中我想要的唯一字符是alpha和空格。

我的正则表达式是:

\{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']

有人可以指出我的模式有什么问题吗?

5 个答案:

答案 0 :(得分: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]+)\}'

答案 1 :(得分:2)

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

答案 2 :(得分: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)

返回以下内容:

  

[ '{日期:YYYYMMDD}']

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

  

(?= ...)   匹配if ...匹配next,但不消耗任何字符串。这称为先行断言。对于>示例,Isaac(?= Asimov)将仅匹配'Isaac',如果它后跟'Asimov'。(source)

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

答案 3 :(得分:0)

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

足够

或者,可能会更好

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

答案 4 :(得分:0)

在整个正则表达式周围使用捕获组,并为(\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}']