regex python - TypeError: ожидаемая строка или байтовидный объект с лямбда-выражением - PullRequest
0 голосов
/ 23 мая 2018

У меня есть список кортежей (примерно 300), каждый из которых состоит из двух элементов.Первый элемент - это ключевое слово, второй - список строк, которые содержат ключевое слово.Приведенная ниже функция должна изначально генерировать кортеж, состоящий из списков, которые являются либо длинными строками, либо пустыми.Например,

beginning = [('keyword1', [] [] ['$5'] ['This has $6.50'], ['this has 4']), ('keyword2', [] [] [] [], []['5.5'])]

Я бы хотел, чтобы мой окончательный вывод удалял пустые списки и предоставлял список кортежей, в котором первое время является ключевым словом, второе - любое упоминание цены, сделанной в комментариях, которые содержатКлючевым словом и последним элементом является любая упомянутая цифра, к которой не прикреплен символ валюты.Например,

desired_output = [('keyword1', ['$6.50'] ['$5'], ['4']), ('keyword2',[],['5.5'])]

У меня есть функция ниже, но я получаю сообщение об ошибке:

  TypeError: expected string or bytes-like object

Есть ли способ изменить функцию ниже, чтобы она была более эффективной или работалас его текущей структурой.

import re
def collect_keyterms(list_of_tuples):
    price_re = re.compile(r'^.*[\$\£\€]\s?\d{1,3}(?:[.,]\d{3})*(?:[.,]\d{1,2})?.*$')
number_re = re.compile(r'\b\d[.]\d{1,2}\b')
new_list = [(keyword, [re.findall(price_re, post) for post in posts], [re.findall(number_re, post) for post in posts]) for keyword, posts in tuples_with_keyword_posts]
final = [(keyword, list(filter(lambda x:re.findall(r'\d', x), currencies)), list(filter(lambda y:re.findall(r'\d', y), posts))) for keyword, currencies, posts in new_list]
return final

1 Ответ

0 голосов
/ 23 мая 2018

Вы можете использовать распаковку с re:

import re
def sort_key(d):
  return (bool(re.findall('^\$[\d\.]+|\£[\d\.]+|\€[\d\.]+', d[0])), float(d[0][1:]) if not d[0][0].isdigit() else float(d[0])) if len(d) else (False, 0)

beginning = [('keyword1', [], [], ['$5'], ['This has $6.50'], ['this has 4']), ('keyword2', [] ,[] ,[] ,[], [],['5.5'])]
new_results = [(a, *sorted([re.findall('^\$[\d\.]+|\£[\d\.]+|\€[\d\.]+|[\d\.]+', i[0]) for i in b if i], key=sort_key)) for a, *b in map(lambda x:filter(None, x), beginning)]

Вывод:

[('keyword1', ['4'], ['6.50'], ['$5']), ('keyword2', ['5.5'])]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...