3

我使用python 2.7。我在文件“a”中有数据:

myname1@abc.com;description1
myname2@abc.org;description2
myname3@this_is_ok.ok;description3
myname5@qwe.in;description4
myname4@qwe.org;description5
abc@ok.ok;description7

我像这样阅读这个文件:

with open('a', 'r') as f:
    data = [x.strip() for x in f.readlines()]

我有一个名为 bad 的列表:

bad = ['abc', 'qwe'] # could be more than 20 elements

现在我试图删除@之后所有带有'abc'和'qwe'的行,并将其余的写入新文件。所以在 newfile 中应该只有 2 行:

myname3@this_is_ok.ok;description3
abc@ok.ok;description7

我一直在尝试使用正则表达式 (. ?)@(. ?);(.*) 来获取组,但我不知道下一步该做什么。

请给我建议!

4

4 回答 4

3

这是一个非正则表达式解决方案:

bad = set(['abc', 'qwe'])

with open('a', 'r') as f:
    data = [line.strip() for line in f if line.split('@')[1].split('.')[0] in bad]
于 2012-07-05T07:59:43.190 回答
2
import re
bad = ['abc', 'qwe']

with open('a') as f:
    print [line.strip() 
           for line in f
           if not re.search('|'.join(bad), line.partition('@')[2]]

只要 bad 仅包含正常字符,此解决方案就可以工作。'a|b'字母,数字,下划线,但没有像@phihag 指出的那样干扰正则表达式。

于 2012-07-05T07:25:36.353 回答
0

正则表达式.?不匹配或匹配一个字符。你想要.*?,这是多个字符的惰性匹配:

import re
bad = ['abc', 'qwe']

filterf = re.compile('(.*?)@(?!' + '|'.join(map(re.escape, bad)) + ')').match
with open('a') as inf, open('newfile', 'w') as outf:
    outf.writelines(filter(filterf, inf))
于 2012-07-05T07:25:18.870 回答
0

我使用正则表达式来删除包含@abc 或@qwe 的行。不确定这是否是正确的方法

import re
with open('testFile.txt', 'r') as f:
     data = [x.strip() for x in f.readlines() if re.match(r'.*@([^abc|qwe]+)\..*;.*',x)]

print data    

现在数据将包含没有“@abc”和“@qwe”的行

或使用

data = [x.strip() for x in f.readlines() if re.search(r'.*@(?!abc|qwe)',x)]

根据 astynax 的建议...

于 2012-07-05T08:16:15.797 回答