Разобрать строку со словами, окруженными фигурными скобками, в массив в python 3.5

У меня такая строка:

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

Мне нужен массив, содержащий строки «FIELD1», «FIELD2», «FIELD3», «FIELD4». Другими словами: найдите весь текст, заключенный в {и}, и поместите его в массив. Есть ли простой / умный способ сделать это с помощью Python 3.5?

1
0
819
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

легко с регулярными выражениями, если фигурные скобки не могут быть вложенными:

>>> import re
>>> re.findall(r"\{(.*?)\}","asdf {FIELD1}\n adf {FIELD2} asdf adsf{FIELD3}asdf {FIELD4}")
['FIELD1', 'FIELD2', 'FIELD3', 'FIELD4']

findall удобно создает list всех совпадающих выражений во входных данных.

выражение \{(.*?)\} извлекает данные между фигурными скобками (которые вы должны избегать, потому что они являются специальными в языке регулярных выражений (повторяющиеся группы), даже если они не интерпретируются как таковые в данном конкретном контексте, поэтому они мог опускаются).

Круглые скобки используются только для извлечения части, не являющейся фигурной скобкой, а .*? проверяет соответствие ближайшей закрывающей фигурной скобке (не жадный режим).

Также рекомендуется использовать префикс необработанной строки для регулярных выражений (даже если он здесь не совсем полезен, он позволяет избежать печально известных ловушек \1 и \b)

есть ли необходимость в экранировании {, который всегда переводится как буквальные символы, используемые в специальном символьном формате

Onyambu 10.09.2018 10:21

@Onyambu технически нет ... они особенные только после предыдущего выражения ... но в этом нет никакого вреда :) (если вы внезапно перейдете в шаблон, чтобы соответствовать ранее, то все пойдет не так без экранирования)

Jon Clements 10.09.2018 10:22

@Onyambu, ты прав. В этом конкретном случае они не являются абсолютно необходимыми.

Jean-François Fabre 10.09.2018 10:22

Два нюанса: 1) Фигурные скобки не нужно экранировать в этом случае, поскольку они имеют особое значение только тогда, когда внутри них есть числа (например, {2} или {1,4}). 2) Используйте необработанные строковые литералы для шаблонов регулярных выражений. Покажите новичкам, как это правильно делать.

Aran-Fey 10.09.2018 10:23

@ Оньямбу, а почему? :п

Jon Clements 10.09.2018 10:26

Если кому-то нужны причудливые подходы к этому, вы также можете использовать: [el[1] for el in string.Formatter().parse(the_string)]: p

Jon Clements 10.09.2018 10:29

@JonClements умный. Вы на ответной забастовке? это мог бы быть крутой ответ

Jean-François Fabre 10.09.2018 10:35

@ Jean-François nope ... это просто полное злоупотребление системой форматирования строк и отнюдь не практический ответ ... просто не хотел, чтобы его превзошло решение для разделения: p (плюс - подумал, что вам может понравиться Это)

Jon Clements 10.09.2018 10:37

Мне, делать, это вообще нравится.

Jean-François Fabre 10.09.2018 10:38

и я думал, что мне нужна помощь: p

Jon Clements 10.09.2018 10:39

Для полноты картины вы также можете использовать str.split для получения желаемого результата:

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

Другие вопросы по теме