在python中拆分文件的内容
我收到了以逗号分隔的总统姓名,其中有一些细节如下:在python中拆分文件的内容,python,python-3.x,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 = [198
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., 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.
怎么做?请提供帮助。使用
zip
函数和基于正则表达式:
>>> 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_longest
或zip
的结果,则不需要调用list
。这只是为了演示结果 使用zip
函数和基于正则表达式:
>>> 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_longest
或zip
的结果,则不需要调用list
。这只是为了演示结果 从您的数据集中看,似乎只有名称可以包含,
,其他人不会,因此您可以使用从后面拆分的rsplit
函数,并为其指定参数,'
和2
,这意味着使用逗号从后面拆分,并在两次拆分时停止
范例-
s = "James Earl Carter, Jr., 1977-1981, Democrat".rsplit(',',2)
print(s)
>> ['James Earl Carter, Jr.', ' 1977-1981', ' Democrat']
>>> n = 'James Earl Carter, Jr.'.split(',')[0].split(' ')[-1]
>>> print(n)
Carter
>>> m = 'Ronald Wilson Reagan'.split(',')[0].split(' ')[-1]
>>> print(m)
Reagan
此外,如果对于名称
列表,条件是如果没有,
或如果有逗号,则在列表中选择姓氏,然后选择第一个逗号。一个简单的解决方案是使用“,”再次拆分名称列表,这一次正常的split(“,”)
函数应该这样做,然后使用第一个元素(如果没有逗号,则只有一个元素),然后使用split(“”)再次按空格拆分,然后使用
[-1]`索引获取最后一个元素
范例-
s = "James Earl Carter, Jr., 1977-1981, Democrat".rsplit(',',2)
print(s)
>> ['James Earl Carter, Jr.', ' 1977-1981', ' Democrat']
>>> n = 'James Earl Carter, Jr.'.split(',')[0].split(' ')[-1]
>>> print(n)
Carter
>>> m = 'Ronald Wilson Reagan'.split(',')[0].split(' ')[-1]
>>> print(m)
Reagan
从您的数据集中看,似乎只有名称可以包含
,
,其他名称则不会,因此您可以使用从后面拆分的rsplit
函数,并为其指定参数,'
和2
,这意味着使用逗号从后面拆分,并在两个拆分处停止
范例-
s = "James Earl Carter, Jr., 1977-1981, Democrat".rsplit(',',2)
print(s)
>> ['James Earl Carter, Jr.', ' 1977-1981', ' Democrat']
>>> n = 'James Earl Carter, Jr.'.split(',')[0].split(' ')[-1]
>>> print(n)
Carter
>>> m = 'Ronald Wilson Reagan'.split(',')[0].split(' ')[-1]
>>> print(m)
Reagan
此外,如果对于名称
列表,条件是如果没有,
或如果有逗号,则在列表中选择姓氏,然后选择第一个逗号。一个简单的解决方案是使用“,”再次拆分名称列表,这一次正常的split(“,”)
函数应该这样做,然后使用第一个元素(如果没有逗号,则只有一个元素),然后使用split(“”)再次按空格拆分,然后使用
[-1]`索引获取最后一个元素
范例-
s = "James Earl Carter, Jr., 1977-1981, Democrat".rsplit(',',2)
print(s)
>> ['James Earl Carter, Jr.', ' 1977-1981', ' Democrat']
>>> n = 'James Earl Carter, Jr.'.split(',')[0].split(' ')[-1]
>>> print(n)
Carter
>>> m = 'Ronald Wilson Reagan'.split(',')[0].split(' ')[-1]
>>> print(m)
Reagan
如果要使用
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'))
#假设:s='James Earl Carter,Jr.,1977-1981,民主党'
reg=重新编译('(\w+\s+*(?P\w+),\D*(?P\D+)-(?P\D+),\s*(?P\w+))
m=注册搜索
Name.append(m.group('Name'))
附加(m.group('startyear'))
EndYears.append(m.group('endyear'))
附加方(m.group(“一方”))
如果您想使用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'))
#假设:s='James Earl Carter,Jr.,1977-1981,民主党'
reg=重新编译('(\w+\s+*(?P\w+),\D*(?P\D+)-(?P\D+),\s*(?P\w+))
m=注册搜索
Name.append(m.group('Name'))
附加(m.group('startyear'))
EndYears.append(m.group('endyear'))
附加方(m.group(“一方”))
为此,您可以使用正则表达式。考虑到您希望避免名称之间使用逗号,我用了多年的时间首先拆分字符串,然后将第一部分作为名称处理,然后将第二部分作为参与方处理
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
为此,可以使用正则表达式。考虑到您希望避免名称之间使用逗号,我用了多年的时间首先拆分字符串,然后将第一部分作为名称处理,然后将第二部分作为参与方处理
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
输出
输出
对不起,请参阅编辑的帖子。我想要['Carter'、'Reagan'、'Bush']还有其他的列表呢?这根本没有给他们想要的输出。对不起,请看编辑后的帖子。我想要['Carter'、'Reagan'、'Bush']还有其他列表呢?这根本没有给他们想要的输出。这些列表从哪里来?你需要使用正则表达式来解析这些行。
年
,党
不包含逗号,你可以使用.split
小OT,但是变量中的“\u1”而不是camel case更像python。e、 g.使用“开始年”而不是“开始年”。这些列表来自何处?您需要使用正则表达式来解析年和方不包含逗号,您可以只使用.split
小OT,但变量中的“\u”而不是驼峰大小写更像python。e、 g.使用“开始年”而不是“开始年”。我认为这可能是更好的开始:)。如何制作列表请帮助['James Earl Carter,Jr.','1977-1981','Democratic']
是一个列表,在字符串上运行rsplit
或split
函数,返回列表。你可以开始学习列表,但这并没有给出OP想要的!这确实回答了OP的问题-James-Earl-Carter,Jr.已经包含逗号,所以拆分无法正常工作。怎么做?请帮助。
OP想要Carter
from name!和年分开,你可以请比较你的解决方案!!!我想选民们在这里没有看到任何答案