我遇到的情况是,只有在前一个正则表达式模式匹配时才需要匹配模式。两种模式都不同,matchobj在不同的行中。例如,
文本:
blah blah blah MyHost="xxxx"
again blah blah blah MyIp= "x.x.x.x"
我只对MyHost
和MyIp
之后的问题感兴趣,我还要求MyIp
只有在上述行中有match(MyHost="xxxx")
时才能匹配
我能够分别匹配MyHost
值和MyIp
值,但很难找到符合要求的逻辑。请注意我对python相当新,并尝试了很多搜索并最终在这里。
答案 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
之前首先检查主机名来解决这个问题