在python中拆分文件内容

2024-05-13 18:24:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我得到了用逗号分隔的总统的名字,其中有些细节如下:

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.

怎么做?请帮忙


Tags: 名字细节总统逗号georgejamescarterwilson
3条回答

使用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+(?=[,-]|$)'

将找到位于,-之前或位于字符串末尾的任何单词字符组合

如果您处理的是较长的列表,我建议您使用^{},这对于此类问题更为合适,而且在列表的列数不相同时也很好。它还接受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,这只是为了演示结果

如果你想用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'))

从您的数据集来看,似乎只有名称可以包含,,其他名称不能,因此您可以使用rsplit函数从后面拆分,并为其指定参数','2,这意味着使用逗号从后面拆分并在2个拆分处停止

示例-

s = "James Earl Carter, Jr., 1977-1981, Democrat".rsplit(',',2)
print(s)
>> ['James Earl Carter, Jr.', ' 1977-1981', ' Democrat']

另外,如果对于name列表,条件是在没有,的情况下选择列表中的姓氏,或者如果有逗号,则选择第一个逗号之前的姓氏。一个简单的解决方案是使用“,”再次拆分名称列表,这一次正常的split(',')函数应该这样做,然后使用第一个元素(如果没有逗号,则只有一个元素),然后使用split(' ') and then get the last element using[-1]`index再次按空格拆分

示例-

>>> n = 'James Earl Carter, Jr.'.split(',')[0].split(' ')[-1]
>>> print(n)
Carter
>>> m = 'Ronald Wilson Reagan'.split(',')[0].split(' ')[-1]
>>> print(m)
Reagan

相关问题 更多 >