หลามเทียบเท่าของ 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

แต่ฉันจะจับคู่ regex ใน Python ได้อย่างไร ตัวอย่างเช่นการเติมเต็มของ\w?



มีการอภิปรายที่คล้ายกันเกี่ยวกับ grep ใน python บน SO: stackoverflow.com/questions/1921894/grep-and-pythonคำถามนี้มีคำถามเฉพาะเจาะจงมากกว่านี้
icc97

\ w = คำศัพท์ใด ๆ \ W = อักขระที่ไม่ใช่คำใด ๆ
Kasapo

คำตอบ:


17

regex ในหลามทั้งsearchหรือ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 ในความคิดเห็นที่กล่าวถึงการยืนยันเชิงลบ - lookahead แต่พูดตามตรงฉันคิดว่าข้อมูลโค้ดของคุณนั้นสมเหตุสมผลและสง่างามกว่ามาก ขอบคุณ
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.