两人之间的匹配!在python文件中

2024-10-06 12:34:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文件,其中每个块由!s分隔

!
 vserver XXXX
 virtual XX.xx.XX.XX tcp 389
 owner LDAP
 serverfarm XXX
 idle 5
 persistent rebalance
 inservice
!

我想得到每个包含vserver信息的部分。我尝试在python中使用regex,但是在处理换行字符时遇到了问题

我试过这样的方法:

pattern = r"!\n vserver \S+\n "

Tags: 文件invirtualldappersistenttcpxxxowner
3条回答

您需要告诉Python您正在使用multi-line正则表达式,并且dot characters can match new-lines

>>> m = re.search('^!.*^!', text, re.MULTILINE | re.DOTALL)
>>> m.group(0)
'!\n vserver XXXX\n virtual XX.xx.XX.XX tcp 389\n owner LDAP\n serverfarm XXX\n idle 5\n persistent rebalance\n inservice\n!'

如果要获取vserver的名称

>>> m = re.search('^!.*vserver\s+(\w+).*^!', text, re.MULTILINE | re.DOTALL)
>>> m.group(0)
'!\n vserver XXXX\n virtual XX.xx.XX.XX tcp 389\n owner LDAP\n serverfarm XXX\n idle 5\n persistent rebalance\n inservice\n!'
>>> m.group(1)
'XXXX'

试试看

stri = " the output of open(myfilename,'r').read() "

import re
pattern = r"^!\n vserver \S+\n[^!]+^!"
re.findall(pattern,stri,flags=re.M)

正则表达式:

^!\n            -> match a solitary '!' on its own line followed by newline
 vserver \S+\n  -> starting with vserver \S+\n
[^!]+           -> match the rest of the block, up to..
^!              -> another solitary '!' on its own line.

根据您想要提取的特定信息,regex可以被细化。你知道吗

例如,要提取vserver之后的文本,我可以添加括号:

pattern  = r"^!\n vserver (\S+)\n[^!]+^!"

然后:

re.findall(pattern,stri,flags=re.M) # returns ['XXXX']

这样做的好处是不必一次读取整个文件

from itertools import groupby

with open("data.txt") as infile:
    for block in (j for i,j in groupby(t,'!'.__ne__) if i):
        block = list(block)
        if not block[0].startswith("vserver "):
            continue
        ...

相关问题 更多 >