2012-01-19 2 views
1

У меня есть файл, где каждый блок разделяется ! s. i.eСоответствие между двумя! в файле в python

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

Я хочу получить каждый раздел, содержащий информацию о vserver. Я пытаюсь использовать регулярное выражение в Python, но у меня возникли проблемы дело с новой строки полукокса

Я пытался что-то вроде этого:

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

ответ

5

Вы должны сказать, 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' 
+1

вам не нужно, чтобы включить режим многострочный для того, чтобы это работало. –

+1

@MK .: Если вы хотите только совместить восклицательные знаки в начале строки. – Johnsyweb

1

Попробуйте

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. 

В зависимости от того, какую информацию вы хотите извлечь регулярное выражение может быть уточнена.

Например, чтобы извлечь текст после vserver, я могу добавить в поимке скобках:

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

Тогда:

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

N.B: ['str'] (http://docs.python.org/library/stdtypes.html#string-methods) - это имя встроенного класса в Python и поэтому является плохим выбором имени переменной. – Johnsyweb

+0

ahh, я всегда ужален этим - я изменю свой ответ. ура! –

+0

Вы не одиноки :) – Johnsyweb

0
teststr = """ 
sdafsad 
! 
vserver XXXX 
virtual XX.xx.XX.XX tcp 389 
owner LDAP 
serverfarm XXX 
idle 5 
persistent rebalance 
inservice 
! 
dsfdasfas 
""" 

import re 

m = re.search("!\n[^!]*vserver[^!]*!", teststr) 
print m.group(0) 
+1

NB: ['str'] (http://docs.python.org/library/stdtypes.html#string-methods) - это имя встроенного класса в Python и поэтому плохой выбор имени переменной! – Johnsyweb

0

Я не большой поклонник regexs, как о списке comp?

vserver_blocks = [block for block in data.split("!") if "vserver" in block] 
1

Это имеет то преимущество, не читая в весь файл сразу

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 
     ... 
Смежные вопросы