【问题标题】:Remove regex elements from list从列表中删除正则表达式元素
【发布时间】:2012-07-05 13:43:12
【问题描述】:

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

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

请给我建议!

【问题讨论】:

  • 向我们展示您尝试过的代码。
  • Tisho,我去过那里。但问题是我必须使用正则表达式来创建组进行检查。或者也许还有其他我不知道的方式

标签: python regex list parsing


【解决方案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))

【讨论】:

  • '(.*?)@(?!%s)' % '|'.join(map(re.escape, 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 同意,我会注意的。
【解决方案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]

【讨论】:

    【解决方案4】:

    我使用正则表达式来删除包含@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 的建议...

    【讨论】:

      猜你喜欢
      • 2019-03-15
      • 1970-01-01
      • 1970-01-01
      • 2019-08-20
      • 1970-01-01
      • 2013-08-14
      • 2013-02-08
      • 1970-01-01
      • 2010-09-25
      相关资源
      最近更新 更多