Похоже, что все, что вам нужно сделать, по крайней мере для этого примера, это убрать все пробелы с краев значений brand
и title
. Для этого вам не нужно регулярное выражение, просто вызовите метод strip
.
Однако ваш brand
не является единственной строкой; это список строк (даже если в списке только одна строка). Таким образом, если вы попытаетесь просто strip
или запустить регулярное выражение, вы получите AttributeError
или TypeError
от попытки обработать этот список как строку.
Чтобы это исправить, вам нужно отобразить strip
по всем строкам, либо с помощью функции map
, либо со списком:
item['brand'] = [brand.strip() for brand in item['brand']]
item['title'] = map(str.strip, item['title'])
... какой из двух вариантов вам легче понять.
Если у вас есть другие примеры со встроенными пробелами пробелов, и вы хотите превратить каждый такой пробел в ровно один пробел, вам нужно использовать метод sub
с вашим регулярным выражением:
item['brand'] = [re.sub(ur'\s+', u' ', brand.strip() for brand in item['brand']]
Обратите внимание на префиксы u
. В Python 2 вам нужен префикс u
, чтобы сделать литерал unicode
вместо литерала str
(закодированные байты). И важно использовать шаблоны Unicode против строк Unicode, даже если сам шаблон не заботится о любых не-ASCII символах. (Если все это кажется бессмысленной болью и магнитом ошибки - ну, это так; это главная причина, по которой существует Python 3.)
Что касается retail_price
, применяются те же основные наблюдения. Опять же, это список строк, а не просто строка. И опять же, вам, вероятно, не нужно регулярное выражение. Предполагая, что цена всегда равна $
(или другой односимвольный маркер валюты), за которым следует число, просто отрежьте $
и назовите float
или Decimal
:
item['retail_price'] = [float(price[1:]) for price in item['retail_price']]
… но если у вас есть примеры, которые выглядят по-разному, с произвольными дополнительными символами по обе стороны от цены, вы можете использовать re.search
здесь, но вам все равно потребуется сопоставить его и использовать шаблон Unicode.
Вам также нужно извлечь соответствующий group
из поиска и каким-то образом обработать пустые / недействительные строки (они будут возвращать None
для поиска, и вы не можете преобразовать это в float
). Вы должны решить, что с этим делать, но после попытки с filter
похоже, что вы просто хотите их пропустить. Это достаточно сложно, так что я бы сделал это в несколько шагов:
prices = item['price']
matches = (re.search(r'[0-9.]+', price) for price in prices)
groups = (match.group() for match in matches if match)
item['price'] = map(float, validmatches)
… или, может быть, обернуть это в функцию.