用于动态匹配组对象的Python正则表达式

用于动态匹配组对象的Python正则表达式,python,regex,Python,Regex,我试图使用python中的正则表达式从输出中提取几个感兴趣的字段 假设我的字符串是 Interface1 is down (Administratively down) 我写的正则表达式是: pat = 'Interface(\d) is (\S)+ (.*)' 我能够得到所需的字段,但是当接口启动时,就没有理由打印了,我想让regex也为这种情况工作。。现在用我写的常规exp,它似乎不起作用。。有人能帮忙吗 当接口启动时,输出将是 Interface1 is Up m.group() T

我试图使用python中的正则表达式从输出中提取几个感兴趣的字段

假设我的字符串是

Interface1 is down (Administratively down)
我写的正则表达式是:

pat = 'Interface(\d) is (\S)+ (.*)'
我能够得到所需的字段,但是当接口启动时,就没有理由打印了,我想让regex也为这种情况工作。。现在用我写的常规exp,它似乎不起作用。。有人能帮忙吗

当接口启动时,输出将是

Interface1 is Up
m.group()

Traceback (most recent call last):
  File "<pyshell#38>", line 1, in <module>
    m.group()
AttributeError: 'NoneType' object has no attribute 'group'
接口1已启动
m、 组()
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
m、 组()
AttributeError:“非类型”对象没有属性“组”

您需要删除第二个和最后一个捕获组之间的空格,以便两者匹配。此外,组外的
+
运算符使其成为重复组;把它放在里面

Interface(\d+) is (\S+)(.*)

错误消息是因为当字符串为
Interface1时,您的正则表达式在子字符串
后至少需要两个空格

>>> s1 = "Interface1 is down (Administratively down)"
>>> s2 = "Interface1 is Up"
>>> re.match(r'^Interface(\d) is (\S+)(?: (.+))?$', s1).groups()
('1', 'down', '(Administratively down)')
>>> re.match(r'^Interface(\d) is (\S+)(?: (.+))?$', s2).groups()
('1', 'Up', None)

在regex中调用了
(?:…)
,调用了
(…)
<代码>?
量词(不在to
+
*
之后出现)将把前面的标记作为可选标记。所以
(?:(.+)
是可选的。非捕获组中的空格与单个空格匹配,
(.+)
将所有剩余的一个或多个字符捕获到另一个组。

抱歉。。。我我对regex不熟悉。你能告诉我这是什么意思吗?那么本质上(?(.+)?$,s2)是做什么的呢?对不起,请原谅我的无知。我使用上述正则表达式的原因是,vks答案也会将前导空间捕获到第3组中。但这不会。我还补充了正则表达式失败的原因。谢谢你花时间写下解释。但是有一个问题,当我阅读正则表达式基础知识时,match总是在字符串的开头寻找模式。如果我;是的,我们还需要一个“^”符号来控制字符串吗?我假设“^”用于字符串的开头。请澄清。添加锚是安全的。如果所有行的格式相同,则使用锚定。例如,vks的正则表达式将在我的正则表达式不匹配的地方找到匹配项
^
断言我们在一行的开头,
$
断言我们在一行的结尾。谢谢..这是有道理的,但我在使用断言时必须足够小心,因为即使是应该在其上操作正则表达式的提取字符串的前导空格/尾随空格也必须被剥离。。。如果我做错了,请纠正我。啊哈!回到演示?酷+1.(但是你又忘了在URL的末尾添加#python.:()也许你应该编写一个正则表达式来自动在末尾添加它!:)哈哈,为什么要添加模块?在键入答案时,在末尾添加一个
print(“#python”)
:)@BhargavRao
re.sub(r“^(+)$”,r“\1#python”,link)
:P…参见演示。是的!这是正确的方法+1也请发表评论!