Сопоставление строки, отформатированной как список

Я читаю данные из CSV-файла, в котором есть столбец с данными в следующем формате:

['Alloy Wheels', 'Bluetooth', 'Backup Camera', 'Heated Seats']

Первоначально я пытался разобрать его как список, но на самом деле это просто строка, поэтому мне нужен способ извлечь фактические значения из этой строки.

Я думаю, что лучший способ сделать это - использовать регулярное выражение (если я не ошибаюсь здесь).

Я не очень хорошо разбираюсь в регулярных выражениях, поэтому я придумал что-то вроде этого:

[a-zA-Z\s]*

и протестировал его на https://regex101.com/, но я обнаружил, что он также создает совпадения с пробелами, а не только для символов, определенных в [].

Как мне очистить это, чтобы оно соответствовало только символам a-zA-Z, заключенным в ''?

Если ваша строка действительно является синтаксически допустимым представлением списка Python, тогда откажитесь от подхода регулярных выражений и вместо этого используйте ast.literal_eval() для его интерпретации.

BoarGules 15.12.2020 01:20

Да, ты был прав. Библиотека ast — гораздо лучший способ решить эту проблему.

ibby 16.12.2020 23:20
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Если вы твердо настроены на регулярное выражение, а ввод правильно сформирован (читается, что не содержит экранированной одинарной кавычки), этого должно быть достаточно:

import re
list_str = "['Alloy Wheels', 'Bluetooth', 'Backup Camera', 'Heated Seats']"

# match any characters between single quotes in a non-greedy fashion
regex = r"'(.*?)'"    

matches = re.findall(regex, list_str)
# matches = ['Alloy Wheels', 'Bluetooth', 'Backup Camera', 'Heated Seats']

Другие варианты включают в себя:

  • проанализируйте строку, используя ast.literal_eval() (кредит @BoarGules)
  • прочитайте строку, используя json.loads, предостережение здесь заключается в том, что одинарные кавычки должны быть заменены двойными кавычками перед передачей строки в json.loads

код для решения модуля json:

import json

list_str = "['Alloy Wheels', 'Bluetooth', 'Backup Camera', 'Heated Seats']"

as_list = json.loads(list_str.replace("'", '"'))

код для решения ast:

import ast
list_str = "['Alloy Wheels', 'Bluetooth', 'Backup Camera', 'Heated Seats']"
as_list = ast.literal_eval(list_str)

Отлично, метод ast.literal_eval() — гораздо более простой способ сделать это по сравнению с тем, что я пробовал изначально. Спасибо.

ibby 15.12.2020 06:30

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