Con trăn tương đương với grep -v là gì?


14

Tôi thích grep -v. Tôi sử dụng nó mọi lúc. Nhưng tôi cũng đang thực hiện một số xử lý văn bản trong python, và có một điều quan trọng mà tôi thiếu.

Thông thường, tôi sử dụng grep -vđể lấy những thứ không liên quan ra khỏi văn bản.

Ví dụ,

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

$ grep '[a-z]' > linesiwanted

Nhưng làm thế nào để tôi phù hợp với phần bổ sung của regex trong Python? Chẳng hạn, phần bù của \w?



Có một cuộc thảo luận tương tự về grep in python trên SO: stackoverflow.com/questions/1921894/grep-and-python , câu hỏi này phiên bản cụ thể hơn về điều đó
icc97

\ w = bất kỳ từ char \ W = bất kỳ char không từ nào
Kasapo

Câu trả lời:


17

Một regex trong Python, searchhoặc matchphương thức, trả về một Matchđối tượng hoặc None. Để grep -vtương đương, bạn có thể sử dụng:

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

Hay chính xác hơn:

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

+1 liên kết SO trong bình luận đề cập đến các xác nhận tiêu cực nhưng thành thật mà nói tôi nghĩ đoạn trích của bạn hợp lý và thanh lịch hơn nhiều. cảm ơn.
ixtmixilix

hóa ra bạn cũng có thể sử dụng [^ az] để khớp với phần bù của tập [az]
ixtmixilix

1

Hóa ra bạn chỉ có thể sử dụng [^ az] để có nghĩa grep -v [a-z].

Tôi đang sử dụng nó như:

#!/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

Những điều này không giống nhau. grep -v '[a-z]'có nghĩa là "loại trừ bất kỳ dòng nào chứa một ký tự trong phạm vi từ ađến z" nhưng bạn đã triển khai grep '[^a-z]'có nghĩa là "bao gồm bất kỳ dòng nào chứa một ký tự không nằm trong phạm vi từ ađến z". Nếu một dòng có abc123thì truy vấn của bạn sẽ in sai vì nó 1đáp ứng các tiêu chí đó. grep -v '[a-z]'sẽ không in dòng này vì ađáp ứng các tiêu chí phủ định.
Adam Katz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.