从列表中删除正则表达式元素

时间:2012-07-05 07:16:32

标签: python regex list parsing

我使用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

我一直在尝试使用regexp(。?)@(。?);(。*)来获取群组,但我不知道下一步该怎么做

请告诉我!

4 个答案:

答案 0 :(得分: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]

答案 1 :(得分: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只包含普通字符,此解决方案就可以正常工作。字母,数字,下划线,但没有像@phihag所指出的那样干扰像'a|b'那样的正则表达式。

答案 2 :(得分:0)

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

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

答案 3 :(得分: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的建议...