什么是grep -v的python等价物?


14

我喜欢grep -v。我用它所有的时间。但是我也正在用python做一些文本处理,而我缺少一件事。

通常,我通常grep -v将多余的内容从文本中删除。

例如,

$ grep -v '[a-z]'
# (I manually review this output to confirm that I don't want those lines)

$ grep '[a-z]' > linesiwanted

但是如何匹配Python中的正则表达式的补码?例如,\w?的补码。



在SO上也有关于python中grep的类似讨论:stackoverflow.com/questions/1921894/grep-and-python,这个问题的具体版本
icc97

\ w =任何单词char \ W =任何非单词char
Kasapo '18

Answers:


17

Python中的正则表达式(searchmatch方法)返回Match对象或None。对于grep -v等效项,您可以使用:

import re
for line in sys.stdin:
    if re.search(r'[a-z]', line) is None:
        sys.stdout.write(line)

或更简而言之:

import re; sys.stdout.writelines([line for line in sys.stdin if re.search(r'[a-z]', line) is None])

+1评论中的SO链接提到了负面的前瞻性断言,但老实说,我认为您的代码段更加明智和优雅。谢谢。
ixtmixilix 2012年

事实证明,您还可以使用[^ az]来匹配集合[az]的补码
ixtmixilix 2012年

1

事实证明,您只可以使用[^ az]来表示grep -v [a-z]

我使用它像:

#!/usr/bin/env python
# coding=UTF-8

import sys, re

for file in sys.argv[1:]:
    f = open(file)
    string = f.read()
    regex = re.compile('[^a-z]')
    subs = regex.sub('', string)
    f.close()
    print subs

这些不一样。 grep -v '[a-z]'表示“排除包含从a到范围的字符的任何行z”,但是您已经实现grep '[^a-z]'了表示“包括包括不在a到范围的字符的任何行z”。如果有一行,abc123那么您的查询将由于1满足该条件而错误地打印出来。grep -v '[a-z]'因为a满足否定条件,所以不会打印此行。
亚当·卡兹
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.