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

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'的行,并将其余部分写入新文件。因此,在新文件中应该只有两行:
myname3@this_is_ok.ok;description3
abc@ok.ok;description7

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

请给我建议!


2
展示你已经尝试过的代码。 - msvalkon
https://dev59.com/BWgu5IYBdhLWcg3wbGml#11329368 - Tisho
Tisho,我曾经遇到过这个问题。但是问题在于我必须使用正则表达式来创建分组进行检查。或者也许有其他我不知道的方法。 - Alex
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]

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',此解决方案就能够起作用。


这对于bad的不良值会失败,例如['a|b'] - phihag
@phihag同意,我会记下来的。 - jamylak

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

'(.*?)@(?!%s)' % '|'.join(map(re.escape, bad) - Aleksei astynax Pirogov

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的建议...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接