我的字符串看起来像这样:
{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']
有人可以指出我的模式有什么问题吗?
答案 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}']