您好我正在尝试创建一个python程序,分裂各种符号,如;或者,我有一个这样的文本文件:
bobby b ; 1999/3/3
danny d , 1994/7/7
注意间距。我想分解我尝试过的各种符号:
d={}
f = open('names.txt', "r")
for line in f:
test= re.split(r'\s*[;,.]\s*', line)
firstName=test[0]
dateName=test[1] #
print firstName, dateName
名字似乎没问题,当我打印名字[0]时,我得到了名字,例如danny d但是当我尝试约会[1]时,我得到一个超出范围的错误。为什么是这样?
答案 0 :(得分:1)
您向我们展示的代码和数据无法产生您所描述的问题。
但是,我愿意打赌你的实际数据会产生类似的问题。
如果数据中有空行,请考虑会发生什么:
>>> line = ''
>>> test = re.split(r'\s*[;,.]\s*', line)
>>> test
['']
>>> date=test[1]
IndexError: list index out of range
所以,你甚至没有得到你抱怨的date[1]
代码(但没有向我们展示)。
答案 1 :(得分:0)
正如abarnert在回答中所说的那样,错误是因为数据中有空行时!
我还建议,如果所有行的格式都是bobby b ; 1999/3/3
,其中名字在前导,而日期在尾随,则不需要regex
只需split
行并选择第一个条目,最后!
>>> s="bobby b ; 1999/3/3"
>>> s.split()
['bobby', 'b', ';', '1999/3/3']
>>> s.split()[0]
'bobby'
>>> s.split()[-1]
'1999/3/3'
因此,对于同样错误的拒绝使用if
条件:
with open('names.txt', "r") as f :
for line in f.readlines():
if len(line):
print "name is : " + line.split()[0]
print "name is : " + line.split()[-1]
答案 2 :(得分:0)
您可以使用strip()
删除空格。
d="""bobby b ; 1999/3/3
danny d , 1994/7/7"""
import re
for line in d.splitlines():
test= re.split(';|,',line)
firstName=test[0].strip().split(" ")[1]
date=test[1].strip()
print firstName, date
输出:
b 1999/3/3
d 1994/7/7
如果您想获得全名,则无需拆分即可获得姓/名。您还需要映射变量名称< ==>日期,其中名称是唯一的,您可以使用名称作为获取此信息的密钥来获取日期。
import re
D={}
for line in d.splitlines():
test= re.split(';|,',line)
firstName=test[0].strip()
date=test[1].strip()
D[firstName]=date
print D
输出:
{'danny d': '1994/7/7', 'bobby b': '1999/3/3'}
您需要在字典中存储姓名/日期,以便您可以通过选择姓名直接获取日期。
print D['danny d'] #Output: '1994/7/7'
如果您想在列表中存储日期,并通过索引访问此列表来获取它们。您可以将日期/名字定义为列表。每次浏览文件时都存储变量
import re
D={}
firstName,date=[],[]
for line in d.splitlines():
test= re.split(';|,',line)
firstName+=[test[0].strip()]
date+=[test[1].strip()]
print date[1] #1994/7/7
您的列表日期应包含此内容['1999/3/3', '1994/7/7']
答案 3 :(得分:-1)
这就是你想要的:你需要使用Escape sequence
>>> l='danny d , 1994/7/7'
>>> re.split('[;,\.//]',l)
['danny d ', ' 1994', '7', '7']
>>> l='danny d , 1994/7/7'
>>> name,date = re.split('[;,\.]',l)
>>> name
'danny d '
>>> date
' 1994/7/7'
您可以使用strip
从开始和结束中删除不需要的空间