【问题标题】:Split element in a list拆分列表中的元素
【发布时间】:2016-07-05 08:27:01
【问题描述】:

我有一个输入字符串:

"[u'$799,900', u'$1,698,000', u'$998,000', u'$1,299,000', u'$1,000,000', u'$499,950', u'$995,000', u'$998,000', u'$2,000,000', u'$988,000', u'$979,000', u'$1,285,000', u'$988,000', u'$579,000', u'$700,000', u'$1,100,000', u'$1,557,000', u'$999,888', u'$798,000', u'$998,000', u'$1,050,000', u'$888,000', u'$559,888', u'$774,900', u'$795,000', u'$850,000']","[u'3 bds', u' 2 ba', u' 1,361 sqft', u'4 bds ', u' 3 ba ', u' 2,845 sqft', u'3 bds ', u' 3 ba ', u' 1,534 sqft', u'3 bds', u' 2 ba', u' 1,762 sqft', u'5 bds', u' 3 ba', u' 2,398 sqft', u'2 bds', u' 2 ba', u' 956 sqft', u'4 bds', u' 3 ba', u' 1,840 sqft', u'3 bds', u' 2 ba', u' 1,212 sqft', u'3 bds', u' 3 ba', u' 1,878 sqft', u'3 bds', u' 2 ba', u' 1,240 sqft', u'3 bds', u' 2 ba', u' 1,207 sqft', u'3 bds', u' 3 ba', u' 1,905 sqft', u'3 bds', u' 3.5 ba', u' 1,591 sqft', u'2 bds', u' 2 ba', u' 946 sqft', u'2 bds', u' 2 ba', u' 1,067 sqft', u'4 bds', u' 3 ba', u' 2,254 sqft', u'5 bds', u' 4 ba', u' 2,744 sqft', u'3 bds', u' 3 ba ', u' 1,291 sqft', u'4 bds ', u' 3 ba ', u' 1,480 sqft', u'3 bds ', u' 2 ba', u' 1,513 sqft', u'4 bds', u' 2 ba', u' 1,846 sqft', u'9 bds ', u' 5 ba', u' 3,336 sqft', u'2 bds', u' 2 ba', u' 983 sqft', u'4 bds', u' 3 ba', u' 1,476 sqft', u'3 bds', u' 3 ba', u' 1,872 sqft', u'2 bds', u' 3 ba', u' 1,459 sqft']"

从中,我需要将 prices 提取到ints 的列表中。

这是我迄今为止尝试过的:

import re

pattern_price = r'\[u\'\$.*?\]'
patternx = r"(.*?u.*?)(\d+\,\d+\,\d+|\d+\,\d+)"

with open(fpath, "r") as f:
    for line in f.readlines():
        lst = re.findall(pattern_price, line)      

    print len(lst) # I get list with 1 element?

    newlst = [x.split(patternx) for x in lst]
    print len(newlst) # I got 1 element again?

类似问题的答案对我没有帮助:Link1Link2

【问题讨论】:

  • 请提供原字符串,肯定有办法直接拆分。
  • 我很确定| 是一个错字,应该是,。除此之外,我不确定您要做什么。你能发布输入和预期输出的例子吗?
  • @Slayther - 这不是一个错字 - 想法是 grep 数十万和数百万的值 - 我用示例字符串在 regex101 上检查它并且它有效 - 我已经发布了预期输出的示例并调用它是 newlst - 不确定缺少什么 - 输入字符串是 lst - 预期输出是 newlst
  • 预期的输出没有 5 个条目,它有 13 个。除非那是一个错字
  • newlst = [799,900, 1,698,000, 998,000, 1,299,000,1,000,000] 有 13 个条目。那是你真正想做的吗?还是那个错字?

标签: python regex list


【解决方案1】:

您的代码中有几个问题。


创建一个保存值的变量

与您当前的问题无关,但如果您想扩展您的解决方案,这很重要:

您正在遍历文件的行,但没有保留一个保存您所经历的值的变量。

是的,您正在创建一个列表,但该列表是在 for 循环中重新创建的每一行

因此,您将只获取文件的最后一行,而其他文件未处理。

要解决这个问题,请在循环之前添加一个变量并添加到它。

with open(fpath, "r") as f:
    lst = []
    for line in f.readlines():
        lst.append( ... )

价格模式

您正在捕获保存价格的字符串的整个部分。这就是为什么您只能获得 1 个匹配项,而不是每个价格都有 1 个匹配项。

要仅获取价格,您可以使用以下regex

'''
\$             # Make sure the numbers start with dollar sign (Has to be escaped as it is special sign)
(              # Start capturing group, this is what we want as output
    [\d,]      # Match either a digit (0-9) or a comma ','
    {7,11}     # Match the previous expression 7 to 11 times, getting '100,000' up to '100,000,000'
)              # End the capturing group
'''

通过正则表达式分割字符串

您正在尝试通过正则表达式拆分字符串:

x.split(patternx)

这是做什么的,它需要正则表达式,它是一个分隔符字符串,而不是一个正则表达式。

因此,它只是将 子字符串与字符串进行比较,没有找到任何匹配项,然后简单地返回整个字符串。

您应该改用re.split


从字符串中提取数字

最后,您需要将字符串转换为数字并将它们添加到列表中。

为此,您必须遍历 re.findall 返回的列表,去掉逗号并将它们转换为 int。

prices = re.findall(pattern, line)
    for price in prices:
        number = int(price.replace(',', ''))
        lst.append(number)

最终代码

import re

pattern = r'\$([\d,]{7,11})'

with open(fpath, "r") as f:
    lst = []
    for line in f.readlines():
        prices = re.findall(pattern, line)
        for price in prices:
            number = int(price.replace(',', ''))
            lst.append(number)
    print lst

【讨论】:

  • 非常感谢 - 再次:)
  • 抱歉耽搁了,这里是完整的解释。如果您还有其他问题,请随时提问。
猜你喜欢
  • 1970-01-01
  • 2014-06-02
  • 1970-01-01
  • 2023-03-10
  • 2017-04-25
  • 2023-04-05
  • 1970-01-01
  • 2021-11-22
相关资源
最近更新 更多