在Python3.5中,将带大括号的单词的字符串解析为数组

在Python3.5中,将带大括号的单词的字符串解析为数组,python,python-3.x,Python,Python 3.x,我有一根这样的线: "asdf {FIELD1}\n adf {FIELD2} asdf adsf{FIELD3}asdf {FIELD4}" 我需要的是一个包含字符串“FIELD1”、“FIELD2”、“FIELD3”、“FIELD4”的数组。换句话说:找到由{和}包围的所有文本并将其放入数组。使用Python 3.5是否有一种简单/聪明的方法可以做到这一点?只要大括号不能嵌套,使用正则表达式也很容易: >>> import re >>> re.finda

我有一根这样的线:

"asdf {FIELD1}\n adf {FIELD2} asdf adsf{FIELD3}asdf {FIELD4}"

我需要的是一个包含字符串“FIELD1”、“FIELD2”、“FIELD3”、“FIELD4”的数组。换句话说:找到由{和}包围的所有文本并将其放入数组。使用Python 3.5是否有一种简单/聪明的方法可以做到这一点?

只要大括号不能嵌套,使用正则表达式也很容易:

>>> import re
>>> re.findall(r"\{(.*?)\}","asdf {FIELD1}\n adf {FIELD2} asdf adsf{FIELD3}asdf {FIELD4}")
['FIELD1', 'FIELD2', 'FIELD3', 'FIELD4']
findall
方便地创建输入中所有匹配表达式的
列表

\{(.*?\}
表达式提取大括号之间的数据(必须转义大括号,因为它们在正则表达式语言(重复组)中是特殊的,即使在这个特定上下文中它们没有被解释为特殊的,所以可以省略)

括号仅用于提取非大括号部分,
*?
确保您匹配的是最近的闭合大括号(非贪婪模式)


为正则表达式使用原始字符串前缀也是一种很好的做法(即使它在这里不是绝对有用,但它可以避免臭名昭著的
\1
\b
陷阱)

只要大括号不能嵌套,正则表达式就很容易:

>>> import re
>>> re.findall(r"\{(.*?)\}","asdf {FIELD1}\n adf {FIELD2} asdf adsf{FIELD3}asdf {FIELD4}")
['FIELD1', 'FIELD2', 'FIELD3', 'FIELD4']
findall
方便地创建输入中所有匹配表达式的
列表

\{(.*?\}
表达式提取大括号之间的数据(必须转义大括号,因为它们在正则表达式语言(重复组)中是特殊的,即使在这个特定上下文中它们没有被解释为特殊的,所以可以省略)

括号仅用于提取非大括号部分,
*?
确保您匹配的是最近的闭合大括号(非贪婪模式)


为正则表达式使用原始字符串前缀也是一种很好的做法(即使它在这里不是绝对有用,但它可以避免臭名昭著的
\1
\b
陷阱)

为了完整性,您也可以使用
str.split
来获得所需的输出:

s = "asdf {FIELD1}\n adf {FIELD2} asdf adsf{FIELD3}asdf {FIELD4}"
[i.split('}')[0] for i in s.split('{')[1:]]

为完整起见,您还可以使用
str.split
获得所需的输出:

s = "asdf {FIELD1}\n adf {FIELD2} asdf adsf{FIELD3}asdf {FIELD4}"
[i.split('}')[0] for i in s.split('{')[1:]]

是否需要转义
{
除非在特殊字符中使用,否则始终翻译为文字format@Onyambu从技术上讲,不……它们只是在前一个表达式之后才显得特别……但这并没有什么害处:)(如果你突然按照与前一个表达式匹配的模式执行,那么如果不进行逃逸,事情就会变得很奇怪)@你说得对。在那种情况下,它们不是绝对必要的。@onyanbu但为什么呢?:pand当时我在想我需要帮助:pis需要逃跑吗
{
除非在特殊字符中使用,否则始终翻译为文字format@Onyambu从技术上讲,不……它们只是在前一个表达式之后才显得特别……但这并没有什么害处:)(如果你突然按照与前一个表达式匹配的模式执行,那么如果不进行逃逸,事情就会变得很奇怪)@你说得对。在这种情况下,它们不是绝对必要的。@onyanbu但为什么呢?:我当时认为我需要帮助:p