Python क्या 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 = कोई भी शब्द char \ W = कोई भी गैर-शब्द चार
कासापो

जवाबों:


17

पाइथन में एक रेगेक्स या तो 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 टिप्पणी में एसओ लिंक नकारात्मक-लुकहेड कथनों का उल्लेख करता है लेकिन ईमानदार होने के लिए मुझे लगता है कि आपका स्निपेट बहुत अधिक समझदार और सुरुचिपूर्ण है। धन्यवाद।
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नकारात्मक मानदंड को संतुष्ट करता है।
एडम काटज़
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.