仅在先前模式匹配时匹配模式

时间:2014-08-04 05:52:06

标签: python regex

我遇到的情况是,只有在前一个正则表达式模式匹配时才需要匹配模式。两种模式都不同,matchobj在不同的行中。例如,

文本:

blah blah blah MyHost="xxxx"
again blah blah blah MyIp= "x.x.x.x"

我只对MyHostMyIp之后的问题感兴趣,我还要求MyIp只有在上述行中有match(MyHost="xxxx")时才能匹配

我能够分别匹配MyHost值和MyIp值,但很难找到符合要求的逻辑。请注意我对python相当新,并尝试了很多搜索并最终在这里。

5 个答案:

答案 0 :(得分:1)

  只有当上述行中有MyIp时,

match(MyHost="xxxx")才能匹配。

懒惰方式从索引1获取匹配的组。您已经知道MyHost

之后的下一步是什么
\bMyHost="xxxx"\r?\n.*?MyIp=\s*\"([^"]*)

这是demo

示例代码:

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)

答案 1 :(得分:1)

您可以通过正则表达式模块执行此操作。

>>> 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'

仅当字符MyIp出现在上一行时,才匹配MyHost="xxxx"的值。

如果要列出两者,请尝试以下代码。

>>> m = regex.findall(r'(?<=(MyHost="[^"]*")[^\n]*\n.*?)(MyIp=\s*"[^"]*")', s)
>>> m
[('MyHost="xxxx"', 'MyIp= "x.x.x.x"')]

答案 2 :(得分:0)

       (?=.*? MyHost=\"xxx\" .*) .*? MyIp=\"(\S+)\" .*

可以根据需要更改xxx.MyIP将被捕获。

你可以使用python lookahead.Only当xxx匹配regex将继续并获取IP

         (?=regex)regex1

仅当正则表达式匹配时匹配regex1。

答案 3 :(得分:0)

你应该利用short circuiting,我相信python supports it。在短路时,如果第一个条件为真(对于AND运算),则第二个条件将进行评估。所以你的代码将如下所示:

 patternMatch1(MyHost) and patternMatch2(MyIp)

这里你可以让两个模式匹配函数在适当匹配时返回true。

如果您有任何疑问,请与我们联系!

答案 4 :(得分:0)

一般情况下,如果你想使用正则表达式,你需要匹配“MyHost”以及随后的所有内容和“MyIP”,然后将其跟在行尾

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

MYHOST = “\ W +”

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

解决首先必须匹配主机的问题 一个简单的if条件可以通过在Ip

之前首先检查主机名来解决这个问题