从某个字符开始将 python 字符串拆分为 space

Split python string by space starting at certain character

我正在尝试 运行 对充满汽车数据的 .txt 文件进行一些基本分析。我已将文件读入 Python 并尝试将其拆分为适当的列,但是 "first column," 汽车名称有时会有多个单词。例如,下面两行包含我的文件中的一些信息:

  1. 汽车日期颜色数量(header行)
  2. 雪佛兰 Nova 7/1/2000 蓝色 28,000
  3. 凯迪拉克 7/1/2001 银色 30,000

因此,当我单独将每一行拆分为 spaces 时,我最终会得到不同大小的列表——在上面的示例中,"Chevy" 和 "Nova" 将是彼此分开。

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

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 在 space 之后拆分(最终目标是列表看起来像 [carname, date, color, number sold]),但我已经尝试使用 .split() 函数来做到这一点,但到目前为止没有运气。我很想获得有关如何进行的一些指导,因为我对编程还很陌生。

在此先感谢您的帮助!

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

date, color, quantity = line[breakpoint:].split()
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']

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

还要忽略 header 您可以在文件 object.

上调用 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')

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

如果你得到的汽车日期不是某个月的 7 号,会发生什么情况?那么颜色 "Light Blue".

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

例如,给定这种正则表达式可以让您轻松地隔离 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')]