grep -v와 같은 파이썬은 무엇입니까?


14

나는 좋아한다 grep -v. 나는 항상 그것을 사용합니다. 그러나 나는 또한 파이썬에서 텍스트 처리를하고 있으며, 한 가지 중요한 점이 부족합니다.

일반적 grep -v으로 텍스트에서 불필요한 것을 제거하는 데 사용 합니다.

예를 들어

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

$ grep '[a-z]' > linesiwanted

그러나 파이썬에서 정규 표현식의 보완과 어떻게 일치합니까? 예를 들어 \w?



: SO에 파이썬에서 그렙에 대한 유사한 논의있다 stackoverflow.com/questions/1921894/grep-and-python ,이 질문이 더 특정 버전
icc97

\ w = 모든 단어 숯 \ W = 비 단어 숯
Kasapo

답변:


17

파이썬의 정규 표현식 인 searchor match메소드는 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

[^ az]를 사용하여 세트 [az]의 보완 물과 일치시킬 수도 있습니다.
ixtmixilix

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.
Adam Katz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.