我使用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(。?)@(。?);(。*)来获取群组,但我不知道下一步该怎么做
请告诉我!
答案 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的建议...