【问题标题】:regex python - TypeError: expected string or bytes-like object with lambda expression正则表达式 python - TypeError:带有 lambda 表达式的预期字符串或类似字节的对象
【发布时间】:2018-05-23 16:49:54
【问题描述】:

我有一个元组列表(大约 300 个),每个元组由两个项目组成。第一项是关键字,第二项是包含关键字的字符串列表。下面的函数最初应该生成一个由长字符串或空白列表组成的元组。例如

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

我希望我的最终输出删除空白列表并提供一个元组列表,其中第一个是关键字,第二个是在包含关键字的 cmets 中提到的价格,最后一个是任何数字提到没有附加货币符号。例如,

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

【问题讨论】:

标签: python regex lambda tuples


【解决方案1】:

您可以使用 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'])]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-17
    • 2020-10-20
    • 1970-01-01
    • 2015-06-11
    • 2017-08-29
    • 1970-01-01
    • 2022-01-21
    • 2019-10-31
    相关资源
    最近更新 更多