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 匹配具有指定异常的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章