Я читаю данные из CSV-файла, в котором есть столбец с данными в следующем формате:
['Alloy Wheels', 'Bluetooth', 'Backup Camera', 'Heated Seats']
Первоначально я пытался разобрать его как список, но на самом деле это просто строка, поэтому мне нужен способ извлечь фактические значения из этой строки.
Я думаю, что лучший способ сделать это - использовать регулярное выражение (если я не ошибаюсь здесь).
Я не очень хорошо разбираюсь в регулярных выражениях, поэтому я придумал что-то вроде этого:
[a-zA-Z\s]*
и протестировал его на https://regex101.com/, но я обнаружил, что он также создает совпадения с пробелами, а не только для символов, определенных в [].
Как мне очистить это, чтобы оно соответствовало только символам a-zA-Z, заключенным в ''?
Да, ты был прав. Библиотека ast
— гораздо лучший способ решить эту проблему.
Если вы твердо настроены на регулярное выражение, а ввод правильно сформирован (читается, что не содержит экранированной одинарной кавычки), этого должно быть достаточно:
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()
— гораздо более простой способ сделать это по сравнению с тем, что я пробовал изначально. Спасибо.
Если ваша строка действительно является синтаксически допустимым представлением списка Python, тогда откажитесь от подхода регулярных выражений и вместо этого используйте
ast.literal_eval()
для его интерпретации.