从特定字符开始按空格拆分python字符串

时间:2015-01-19 22:10:46

标签: python split

我正在尝试对填充了汽车数据的.txt文件运行一些基本分析。我已经在文件中读到了Python并试图将其拆分为相应的列,但是“第一列”,汽车名称,有时会有多个单词。例如,下面是两行,其中包含我的文件中包含的一些信息:

  1. 汽车日期颜色数量(标题行)
  2. Chevy Nova 7/1/2000 Blue 28,000
  3. 凯迪拉克7/1/2001银牌30,000
  4. 因此,当我单独用空格分割每一行时,我最终会得到不同大小的列表 - 在上面的例子中,“雪佛兰”和“新星”将彼此分开。

    我找到了一种方法来识别代表汽车名称的每一行的部分:

    for line in cardata:
    if line == line[0]: #for header line
        continue
    else:
        line = line.rstrip()
        carnamebreakpoint =  line.find('7/')
        print carnamebreakpoint
        carname = line[:carnamebreakpoint]
        print carname
    

    我现在要做的是告诉python在 carname之后用空格拆分(列表的最终目标看起来像[carname,date,color,sold sold]) ,但我试过玩.split()函数来做到这一点,到目前为止没有运气。我喜欢关于如何继续的一些指导,因为我对编程很新。

    提前感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

s = "Chevy Nova 7/1/2000 Blue 28,000"  
s.rsplit(None,3)

它只会从字符串末尾分割3次:

In [4]: s = "Chevy Nova 7/1/2000 Blue 28,000"    
In [5]: s.rsplit(None,3)
Out[5]: ['Chevy Nova', '7/1/2000', 'Blue', '28,000']
In [8]: s ="Car Date Color Quantity "
In [9]: s.rsplit(None,3)
Out[9]: ['Car', 'Date', 'Color', 'Quantity']

这假设最后三个项目将始终是单个字符串,如您的示例中应该是正确的,否则您的索引方法也将失败。

另外要忽略标题,可以在文件对象上调用next()。

with open("your_file.txt") as f:
    header = next(f)
    for line in f:
        car_name,date,col,mile = line.rstrip().rsplit(None,3)
        print(car_name,date,col,mile)
('Chevy Nova', '7/1/2000', 'Blue', '28,000')
('Cadillac', '7/1/2001', 'Silver', '30,000')

答案 1 :(得分:1)

首先在断点处对字符串进行切片,然后在结果上调用split()

date, color, quantity = line[breakpoint:].split()

答案 2 :(得分:0)

根据您对数据格式的信心,您的解决方案可能不是最佳解决方案。

如果你买的车的日期不同于某个月的7号,会怎么样?那么“浅蓝色”的颜色呢。

这种任务非常适合正则表达式的用例。

例如,给定这种正则表达式可以让您轻松隔离4个组件:

^(.*) (\d{1,2}/\d{1,2}/\d{4}) (.*) ([\d,]+)$

在python中你可以像这样使用它:

import re
s = "Chevy Nova 7/1/2000 Blue 28,000"
m = re.match(r"^(.*) (\d{1,2}/\d{1,2}/\d{4}) (.*) ([\d,]+)$", s)
m.group(1) # => Chevy Nova
m.group(2) # => 7/1/2000
m.group(3) # => Blue
m.group(4) # => 28,0000

如果你有一个包含多行的字符串,你可以像这样批量处理它们:

s = """Chevy Nova 7/1/2000 Blue 28,000
Chevy Nova 10/6/2002 Light Blue 28,000
Cadillac 7/1/2001 Silver 30,000"""

re.findall(r"^(.*) (\d{1,2}/\d{1,2}/\d{4}) (.*) ([\d,]+)$", s, flags=re.MULTILINE)
# => [('Chevy Nova', '7/1/2000', 'Blue', '28,000'),
# =>  ('Chevy Nova', '10/6/2002', 'Light Blue', '28,000'),
# =>  ('Cadillac', '7/1/2001', 'Silver', '30,000')]