Python соответствует регулярному выражению с указанными исключениями

Я использую Python Fabric, пытаясь прокомментировать все строки в файле, которые начинаются с «@», если только за этим «@» не следуют два конкретных IP-адреса. Итак, если файл содержит (без маркеров)

  • @hi
  • @IP1
  • кое-что здесь
  • @IP2

то результирующий файл должен быть (тоже без пуль)

  • #@hi
  • @IP1
  • кое-что здесь
  • @IP2

Это то, что у меня есть до сих пор:

def verify():
    output = sudo("/sbin/service syslog status")
    #if syslog is running
    if 'is running...' in output:  
        #then set output to the value of the conf file                 
        output = sudo("cat /etc/syslog.conf")  
        #If pattern is matched
        if "@" in output and not "@IP1" and not "@IP2":  
            #read all the lines in the conf file     
            sys.stdout = open('/etc/syslog.conf', 'r+').readlines() 
            #and for every line, comment if it matches pattern 
            for line in sys.stdout:
                if "@" in line and not "@1P1" and not   "@IP2":
                line = "#" + line 
    else:
        print GOOD
else:
    print RSYSLOG

Я понимаю это, когда говорю

if "@" in output and not "@IP1" and not "@IP2"

Python думает, что я говорю «сделайте что-нибудь, если в файле есть @, но ТОЛЬКО если у вас также нет @IP1 и @IP2». Я пытаюсь сказать: «сделайте что-нибудь с любой строкой, начинающейся с @, кроме строк @IP1 и @IP2». Также я знаю, что в моем коде есть и другие ошибки, но сейчас я работаю именно над этим.

Спасибо.


person Carl_Friedrich_Gauss    schedule 09.06.2015    source источник


Ответы (3)


Решение регулярного выражения:

Вы можете использовать следующее регулярное выражение для соответствия:

^(?=@(?!(IP1|IP2)))

И заменить на #

См. DEMO.

Код:

re.sub(r'^(?=@(?!(IP1|IP2)))', r'#', myStr)
person karthik manchala    schedule 09.06.2015
comment
Похоже, что Fabric не нравится такой синтаксис. Нужно ли мне заявление об импорте? - person Carl_Friedrich_Gauss; 09.06.2015
comment
Похоже, если бы я использовал это выражение с re снизу, оно приняло бы синтаксис - person Carl_Friedrich_Gauss; 10.06.2015
comment
@Carl_Friedrich_Gauss да .. вы должны использовать его, как с re .. обновил ответ :) - person karthik manchala; 10.06.2015

я бы хотел,

if not "@IP1" in output or not "@IP2" in output:
    if output.startswith("@"):
        // stuff here
person Avinash Raj    schedule 09.06.2015

Проверьте, существуют ли критерии в глобусе, и если да, откройте файл, прочитайте построчно и используйте re.sub(), чтобы добавить встроенный # к строкам, которые его требуют.

import re

ip1 = '1.1.1.1'
ip2 = '2.2.2.2'

fh = open('in.txt', 'r')
f = fh.read()
fh.close()

if re.search(r'(@(?!({0}|{1})))'.format(ip1, ip2), f):
    fh = open('in.txt', 'r')
    for line in fh:
       line = re.sub(r'^(@(?!({0}|{1})))'.format(ip1, ip2), r'#\1', line)
       print(line)

Входной файл:

@1.1.1.1
@this
@2.2.2.2
@3.3.3.3
@
no @
blah

Выход:

@1.1.1.1
#@this
@2.2.2.2
#@3.3.3.3
#@
no @
blah
person stevieb    schedule 09.06.2015