Python 仅当上一个模式匹配时才匹配该模式

Python 仅当上一个模式匹配时才匹配该模式,python,regex,Python,Regex,我有一种情况,只有当前面的正则表达式模式匹配时,我才需要匹配一个模式。两种图案都不同,在不同的线条中匹配。对于exmaple 正文: 我只对MyHost和MyIp之后的内容感兴趣,我还要求MyIp仅在上行有匹配(MyHost=“xxxx”)时才匹配 我能够分别匹配MyHost值和MyIp值,但很难根据需要找到匹配这两个值的逻辑。请注意,我对python相当陌生,尝试了很多搜索,最后来到这里 (?=.*? MyHost=\"xxx\" .*) .*? MyIp=\"(\S+)\" .

我有一种情况,只有当前面的正则表达式模式匹配时,我才需要匹配一个模式。两种图案都不同,在不同的线条中匹配。对于exmaple

正文:

我只对
MyHost
MyIp
之后的内容感兴趣,我还要求
MyIp
仅在上行有
匹配(MyHost=“xxxx”)
时才匹配

我能够分别匹配
MyHost
值和
MyIp
值,但很难根据需要找到匹配这两个值的逻辑。请注意,我对python相当陌生,尝试了很多搜索,最后来到这里

       (?=.*? MyHost=\"xxx\" .*) .*? MyIp=\"(\S+)\" .*
xxx可以根据需要进行更改。MyIP将被捕获

您可以使用python前瞻。只有当xxx匹配正则表达式时,才会继续获取IP

         (?=regex)regex1

只有在正则表达式匹配时才匹配正则表达式1。

我相信,您应该利用python。在短路中,仅当第一个条件为真时(对于和操作),才会评估第二个条件。因此,您的代码如下所示:

 patternMatch1(MyHost) and patternMatch2(MyIp)
在这里,如果两个模式匹配函数正确匹配,那么它们都可以返回true

如果您有任何问题,请告诉我

MyIp
应仅在上行中存在
匹配(MyHost=“xxxx”)
时匹配

以惰性方式从索引1中获取匹配的组。您已经知道MyHost之后的下一步是什么

\bMyHost="xxxx"\r?\n.*?MyIp=\s*\"([^"]*)
这是

示例代码:

import re
p = re.compile(ur'\bMyHost="xxxx"\r?\n.*?MyIp=\s*\"([^"]*)', re.IGNORECASE)
test_str = u"blah blah blah MyHost=\"xxxx\"\nagain blah blah blah MyIp= \"x.x.x.x\""

re.findall(p, test_str)

通常,如果你想使用正则表达式,你需要匹配“MyHost”和后面的所有内容,以及“MyIP”和它后面的内容,直到行尾

所以基本上你要做的就是写一个类似于这个的正则表达式

MyHost=“\w+”

这将匹配MyHost=“”,并且它之间的输入将设置为W 之后,您可以检索W的值并进行所需的计算

要解决必须首先匹配主机的问题
一个简单的if条件可以通过在Ip之前先检查主机名来解决这个问题,您可以通过regex模块来实现这一点

>>> import regex
>>> s = '''blah blah blah MyHost="xxxx"
... foo bar
... again blah blah blah MyIp= "x.x.x.x"
... 
... blah blah blah MyHost="xxxx"
... again blah blah blah MyIp= "x.x.x.x"'''
>>> m = regex.search(r'(?<=MyHost="xxxx"[^\n]*\n.*?MyIp=\s*")[^"]*', s)
>>> m.group()
'x.x.x.x'

在Python中,
&&
是一个按位运算符,不应用短路(尽管它使用
运算符)。但这需要对文本进行两次单独扫描,这是浪费;很好,感谢您对&&和“和”的澄清;我衷心感谢!我想知道你能否解释为什么短路需要两次单独的扫描?我用C风格的语言实现了这个特性,但没有遇到这个问题,而且我从来没有听说过不使用它的原因,因为它是浪费?问题是,无论您使用
还是
&
(我不相信Python中有
&
操作)在同一个字符串上使用两个不同的模式匹配。对于
,如果第一次匹配失败,则不会尝试第二次匹配,这是正确的。但如果成功,则从字符串的开头开始。OP建议两个匹配应该在连续的行上,因此您要么从第一个匹配中提取所需的起点,要么以某种方式将两者关联起来。更容易使用匹配所有必需组件的单一模式;啊,我明白了!谢谢你的澄清。我假设这两个字符串都是事先解析的,但是你说的是完全正确的!感谢您的建议和澄清,我很高兴看到此线程提供了更好的解决方案!:0)您可能需要将正则表达式更改为MyHost=“(\w+”)才能检索它,您必须查找准确的语法
>>> import regex
>>> s = '''blah blah blah MyHost="xxxx"
... foo bar
... again blah blah blah MyIp= "x.x.x.x"
... 
... blah blah blah MyHost="xxxx"
... again blah blah blah MyIp= "x.x.x.x"'''
>>> m = regex.search(r'(?<=MyHost="xxxx"[^\n]*\n.*?MyIp=\s*")[^"]*', s)
>>> m.group()
'x.x.x.x'
>>> m = regex.findall(r'(?<=(MyHost="[^"]*")[^\n]*\n.*?)(MyIp=\s*"[^"]*")', s)
>>> m
[('MyHost="xxxx"', 'MyIp= "x.x.x.x"')]