在python中拆分文件的内容

时间:2015-06-22 15:08:11

标签: python python-3.x

我给了逗号分隔的总统名字,其中包含以下一些细节:

James Earl Carter, Jr., 1977-1981, Democrat
Ronald Wilson Reagan, 1981-1989, Republican
George Herbert Walker Bush, 1989-1993, Republican

现在我想要三个这样的列表:

Name = ['Carter' , 'Reagan' , 'Bush']

StartYears = [1977,1981,1989]

EndYears = [1981,1989,1993]

Party = ['Democrat','Republican','Republican']

但是面临一些问题:

James Earl Carter, Jr. contains comma already so splitting is not working properly.

怎么做?请帮忙。

5 个答案:

答案 0 :(得分:4)

从您的数据集看起来,只有名称中可以包含,,其他人则不会,因此您可以使用从后面拆分的rsplit函数,并将其赋予参数{{1 }和',',这意味着使用逗号从后面拆分并在2次拆分时停止。

示例 -

2

此外,如果对于s = "James Earl Carter, Jr., 1977-1981, Democrat".rsplit(',',2) print(s) >> ['James Earl Carter, Jr.', ' 1977-1981', ' Democrat'] 列表,条件是在没有name的情况下选择列表中的姓氏,或者如果有逗号,请在第一个逗号之前选择姓氏。一个简单的解决方案是使用','再次拆分名称列表,这次正常,函数应该执行,然后取第一个元素(如果没有逗号,则只有一个元素),然后使用split(',') [ - 1]`索引再次按空格分割。

示例 -

split(' ') and then get the last element using

答案 1 :(得分:1)

使用zip函数和基于positive look-ahead的正则表达式:

>>> s="""James Earl Carter, Jr., 1977-1981, Democrat
... Ronald Wilson Reagan, 1981-1989, Republican
... George Herbert Walker Bush, 1989-1993, Republican"""
>>> 
>>> list(zip(*[re.findall(r'\w+(?=[,-]|$)',i) for i in s.split('\n')]))
[('Carter', 'Reagan', 'Bush'), 
 ('1977', '1981', '1989'), 
 ('1981', '1989', '1993'), 
 ('Democrat', 'Republican', 'Republican')]

以下正则表达式:

r'\w+(?=[,-]|$)'

会找到,-之前或字符串末尾的单词字符组合。

如果您要处理较长的列表,我建议使用itertools.zip_longest(),这更适合此类问题,并且当您的列表没有相同的列号时也很好。它还接受fillvalue用于填充缺失列的参数:

>>> s="""James Earl Carter, Jr., 1977-1981, Democrat,anothername,12222 
... Ronald Wilson Reagan, 1981-1989, Republican,33453
... George Herbert Walker Bush, 1989-1993, Republican"""

>>> from itertools import zip_longest
>>> list(zip_longest(*[re.findall(r'\w+(?=[,-]|$)',i) for i in s.split('\n')],fillvalue='**'))
[('Carter', 'Reagan', 'Bush'), 
 ('1977', '1981', '1989'), 
 ('1981', '1989', '1993'), 
 ('Democrat', 'Republican', 'Republican'), 
 ('anothername', '33453', '**')]
>>> 

请注意,在这两种情况下,如果您想迭代izip_longestzip的结果,则无需致电list。这只是为了展示结果!

答案 2 :(得分:0)

如果您想使用re

# Assume: s = 'James Earl Carter, Jr., 1977-1981, Democrat'
reg = re.compile('(\w+\s+)*(?P<name>\w+),\D*(?P<startyear>\d+)-(?P<endyear>\d+),\s*(?P<party>\w+)')
m = reg.search(s)
Name.append(m.group('name'))
StartYears.append(m.group('startyear'))
EndYears.append(m.group('endyear'))
Party.append(m.group('party'))

答案 3 :(得分:0)

您可以使用正则表达式来实现此目的。考虑到你想避免在名称之间使用逗号,我已经用了几年时间先拆分字符串,然后将第一部分作为名称处理,然后处理第二部分作为聚会。

search_string = """James Earl Carter, Jr., 1977-1981, Democrat
Ronald Wilson Reagan, 1981-1989, Republican
George Herbert Walker Bush, 1989-1993, Republican"""

import re
Name=[]
StartYears=[]
EndYears=[]
Party=[]
year = re.compile("[\d]{4}-[\d]{4}")
for i in search_string.split("\n"):
    split_string =  year.search(i).group(0)
    l = i.split(split_string)[0].split(",")[0].split()
    Name.append(l[-1])
    StartYears.append(split_string.split("-")[0])
    EndYears.append(split_string.split("-")[1])
    Party.append(i.split(split_string)[1].split(",")[1].strip())

print Name
print StartYears
print EndYears
print Party

答案 4 :(得分:0)