如何使用正则表达式在python字符串中找到str.format的所有占位符?

如何使用正则表达式在python字符串中找到str.format的所有占位符?,python,regex,Python,Regex,我正在创建一个类,该类使用用户指定的格式重命名文件。此格式将是一个简单字符串,将调用其str.format方法来填充空格 事实证明,我的过程需要提取大括号中包含的变量名。例如,字符串可能包含{user},这将产生user。当然,在一个字符串中会有几组大括号,我需要按照它们出现的顺序获取每个大括号的内容,并将它们输出到列表中 因此,“{foo}{bar}”应该产生['foo',bar'] 我想最简单的方法是使用re.split,但我对正则表达式一无所知。有人能帮我吗 提前谢谢 使用re.finda

我正在创建一个类,该类使用用户指定的格式重命名文件。此格式将是一个简单字符串,将调用其
str.format
方法来填充空格

事实证明,我的过程需要提取大括号中包含的变量名。例如,字符串可能包含
{user}
,这将产生
user
。当然,在一个字符串中会有几组大括号,我需要按照它们出现的顺序获取每个大括号的内容,并将它们输出到列表中

因此,
“{foo}{bar}”
应该产生
['foo',bar']

我想最简单的方法是使用
re.split
,但我对正则表达式一无所知。有人能帮我吗

提前谢谢

使用
re.findall()


另一种可能是使用Python的实际名称本身为您提取字段名:

>>> import string
>>> s = "{foo} spam eggs {bar}"
>>> string.Formatter().parse(s)
<formatteriterator object at 0x101d17b98>
>>> list(string.Formatter().parse(s))
[('', 'foo', '', None), (' spam eggs ', 'bar', '', None)]
>>> field_names = [name for text, name, spec, conv in string.Formatter().parse(s)]
>>> field_names
['foo', 'bar']

只是一个简单的问题。
re.findall
的结果是否保证以与字符串中显示的顺序相同的顺序列出?@blz是的,因为字符串是从左到右解析的。注意,这不考虑格式说明符,例如
{spam:3f}
@DSM的答案应该是公认的。修改
\w
以包含更多字符,直到它与
str.format
的完整规范匹配为止,这可能会起作用,但使用格式化程序本身更好(而且如果语法发生变化,也不容易破坏)ooooo h。。。我喜欢这个!我可能会接受Ashwini Chaudhary的答案,因为我特别要求一个正则表达式解决方案,但我想我会使用你的,因为我更了解它!非常感谢。是否可以修改此选项以查找
%(名称)s
占位符?我认为这是正确的答案。使用与.format()do相同的机制。如果您事先知道所有可能的变量,您可以将它们全部传递给
str.format
——它将忽略模式中不存在的变量<代码>'{user}{bar}'。格式(user='Mike',foo=1,bar=2)将输出
Mike_2
。我碰巧允许在dict中修复变量,所以我可以跳过在模式中查找变量。无论如何,了解
string.Formatter()
是很有用的。
>>> import string
>>> s = "{foo} spam eggs {bar}"
>>> string.Formatter().parse(s)
<formatteriterator object at 0x101d17b98>
>>> list(string.Formatter().parse(s))
[('', 'foo', '', None), (' spam eggs ', 'bar', '', None)]
>>> field_names = [name for text, name, spec, conv in string.Formatter().parse(s)]
>>> field_names
['foo', 'bar']
>>> field_names = [v[1] for v in string.Formatter().parse(s)]
>>> field_names
['foo', 'bar']