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
?
댓글
- stackoverflow.com/questions/164414/ …
- 있습니다 ' sa python의 grep에 대한 유사한 토론 : stackoverflow.com/questions/1921894/grep-and-python ,이 질문은 더 구체적인 버전입니다.
- \ w = 모든 단어 char \ W = 모든 비 단어 문자
답변
정규식 Python에서 search
또는 match
메서드는 Match
객체 또는
. 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 링크는 부정적 예측 주장을 언급하지만 솔직히 말해서 귀하의 스 니펫이 훨씬 더 현명하고 우아하다고 생각합니다. 감사합니다.
- [^ az]를 사용하여 집합 [az]의 보완 요소와 일치시킬 수도 있습니다.
답변
[^ 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]'
는 " iv의 범위에 아니라 문자가 포함 된 모든 행을 포함 함을 의미합니다. id = “d18563eb6f”>
–z
. " 라인에 abc123
그러면 쿼리가 잘못 인쇄됩니다. 1
는 해당 기준을 충족합니다. grep -v '[a-z]'
는 a
가 부정 기준을 충족하므로이 행을 인쇄하지 않습니다.