列表中的拆分元素

时间:2016-07-05 08:27:02

标签: python regex list

我有一个输入字符串:

  

“[你'$ 799,900',你'$ 1,698,000',你'$ 998,000',你'$ 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',   你'$ 795,000',你'$ 850,000']“,”[u'3 bds',你'2 ba',你'1,361平方英尺',u'4   bds',u'3 ba',u'2,845平方英尺',u'3 bds',u'3 ba',u'5,434   sqft',u'3 bds',u'2 ba',u'1,762平方英尺',u'5 bds',u'3 ba',u'   2,398平方英尺',u'2 bds',u'2 ba',u'956平方英尺',u'4 bds',u'3 ba',   u'1840平方英尺',u'3 bds',u'2 ba',u'1,212平方英尺',u'3 bds',u'3   ba',u'1,878平方英尺',u'3 bds',u'2 ba',u'1,240平方英尺',u'3 bds',   u'2 ba',u'1,207平方英尺',u'3 bds',u'3 ba',u'1,905平方英尺',u'3   bds',u'3.5 ba',u'1,591平方英尺',u'2 bds',u'2 ba',u'946   sqft',u'2 bds',u'2 ba',u'1,067平方英尺',u'4 bds',u'3 ba',u'   2,254平方英尺',u'5 bds',u'4 ba',u'2,744平方英尺',u'3 bds',u'3 ba   ',你'1,291平方英尺',u'4 bds',你'3 ba',你'1,480平方英尺',u'3 bds',你们   2 ba',u'1,513平方英尺',u'4 bds',u'2 ba',u'18,446平方英尺',u'9 bds   ','u'5 ba',u'3,336平方英尺',u'2 bds',u'2 ba',u'983平方英尺',u'4   bds',u'3 ba',u'1,476 sqft',u'3 bds',u'3 ba',u'1872   sqft',u'2 bds',u'3 ba',u'1,459平方英尺']“

从中,我需要将价格提取到int的列表中。

这是我到目前为止所尝试的:

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?

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

1 个答案:

答案 0 :(得分:2)

您的代码中存在多个问题。

创建一个包含值

的变量

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

您正在迭代文件行,但不保留一个包含您已经过的值的变量。

是的,您正在创建一个列表,但该列表是在每行的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