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 = ['abc', 'qwe'] # could be more than 20 elements

今、@ の後に「abc」と「qwe」を含むすべての行を削除し、残りを newfile に書き込もうとしています。したがって、newfile は 2 行だけにする必要があります。

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

グループを取得するために regexp (. ?)@(. ?);(.*) を使用しようとしましたが、次に何をすべきかわかりません。

アドバイスしてください!

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

正規表現.?は、1 文字にも一致しないか、または 1 文字に一致します。が必要です.*?。これは、複数の文字の遅延一致です。

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 に答える