Python匹配具有指定异常的正则表达式

时间:2015-06-09 19:57:33

标签: python regex exception fabric prepend

我正在使用Python Fabric,尝试对以“@”开头的文件中的所有行进行注释,除非“@”后面跟着2个特定的IP地址。因此,如果文件包含(没有项目符号)

  • @hi
  • @ IP1
  • 这里的一些东西
  • @ IP2

然后生成的文件应该是(也没有项目符号)

  • #@喜
  • @ 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这些行。”另外我知道我的代码中还有其他错误,但我现在正在研究这个问题。

感谢。

3 个答案:

答案 0 :(得分:1)

正则表达式解决方案:

您可以使用以下正则表达式进行匹配:

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

并替换为#

请参阅DEMO

代码:

re.sub(r'^(?=@(?!(IP1|IP2)))', r'#', myStr)

答案 1 :(得分:0)

我愿意,

if not "@IP1" in output or not "@IP2" in output:
    if output.startswith("@"):
        // stuff here

答案 2 :(得分:0)

检查glob中是否存在条件,如果是,则打开文件,逐行读取,并使用re.sub()在需要它的行中添加#inline。

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