Python正则表达式循环

时间:2012-10-11 08:37:06

标签: python regex search loops findall

我有这个代码,它会查找文件中的某些内容。该文件如下所示:

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 个答案:

答案 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)

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