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

Posted

技术标签:

【中文标题】Python 匹配具有指定异常的正则表达式【英文标题】:Python match a regex with specified exceptions 【发布时间】:2015-06-09 19:57:33 【问题描述】:

我正在使用 Python Fabric,试图注释文件中以“@”开头的所有行,除非“@”后跟 2 个特定 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 行除外。”我也知道我的代码中还有其他错误,但我现在正在处理这个问题。

谢谢。

【问题讨论】:

【参考方案1】:

正则表达式解决方案:

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

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

并替换为#

见DEMO

代码:

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

【讨论】:

看起来 Fabric 不喜欢这种语法。我需要导入声明吗? 看起来如果我使用该表达式和下面的“re”,它接受了语法 @Carl_Friedrich_Gauss 是的.. 你必须像re.. 一样使用它。更新了答案:)【参考方案2】:

我愿意,

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

【讨论】:

【参考方案3】:

检查 glob 中是否存在条件,如果存在,则打开文件,逐行读取,并使用 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

【讨论】:

以上是关于Python 匹配具有指定异常的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

8th,常用模块正则表达式

python 正则表达式 匹配指定字符

python正则表达式指定开始匹配的敌方

python常用re正则表达式大全,查找指定内容

Python_正则表达式

求一个匹配 以指定字符开头,指定字符结尾,中间内容任意的正则表达式