我有这个代码,它会查找文件中的某些内容。该文件如下所示:
name;lastname;job;5465465
name2;lastname2;job2;5465465
name3;lastname3;job3;5465465
这是python代码:
import re
import sys
filehandle = open('somefile.csv', 'r')
text = filehandle.read()
b = re.search("([a-zA-Z]+);([a-z\sA-Z]+);([a-zA-Z]*);([0-9^-]+)\n?",text)
print (b.group(2),b.group(1),b.group(3),b.group(4))
不,它只会打印:
lastname;name;job;5465465
它应该首先打印姓氏,所以我用组做了。现在我需要一个循环来打印所有这样的行:
lastname;name;job;5465465
lastname2;name2;job2;5465465
lastname3;name3;job3;5465465l
我尝试了所有类型的循环,但它并没有通过整个文件......我怎么需要这样做?
必须使用re模块完成。我在csv模块中知道它很简单;)
答案 0 :(得分:1)
不需要re
,但csv
的工作很好:
import csv
with open('somefile.csv', 'r') as f:
for rec in csv.reader(f, delimiter=';'):
print (rec[1], rec[0], rec[2], rec[3])
如果您想检查各个元素的有效性(有效电话号码,名称中没有数字,大写名称等),您可以使用re
。
答案 1 :(得分:1)
您需要逐行处理文件。
import re
import sys
with open('somefile.csv', 'r') as filehandle:
for text in filehandle:
b = re.search("([a-zA-Z]+);([a-z\sA-Z]+);([a-zA-Z]*);([0-9^-]+)\n?",text)
print (b.group(2),b.group(1),b.group(3),b.group(4))
您的文件具有很好的分号分隔值,因此按照建议使用split
或csv库会更容易。
答案 2 :(得分:1)
故障不在于循环,而在于你的正则表达式/捕获组模式。类[a-zA-Z] +将不匹配“lastname3”或“lastname2”。此示例有效:
import re
import sys
for line in open('somefile.csv', 'r'):
b = re.search("(\w+);(\w+);(\w*);([0-9^-]+)\n?",line)
if b:
print "%s;%s;%s;%s" % (b.group(2),b.group(1),b.group(3),b.group(4))
答案 3 :(得分:0)
好像你只想重新排序你所拥有的东西,在这种情况下我不知道是否需要正则表达式。我相信以下可能有用:
reorder = operator.itemgetter(1,0,2,3)