-1

我有这段代码,它将在文件中查找某些内容。该文件如下所示:

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 模块中很容易;)

4

4 回答 4

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))
于 2012-10-11T08:53:14.797 回答
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如果您想检查单个元素的有效性(有效的电话号码、名称中没有数字、大写名称等),您可以使用。

于 2012-10-11T08:46:54.290 回答
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 库会更容易。

于 2012-10-11T08:49:58.470 回答
0

似乎您只想重新排序您拥有的东西,在这种情况下,我不知道是否需要正则表达式。我相信以下内容可能有用:

重新排序 = operator.itemgetter(1, 0, 2, 3)

http://docs.python.org/library/operator.html

于 2012-10-11T08:52:30.653 回答