2016-07-08 4 views
2

Я пытаюсь извлечь строку ниже из строки многострочного:Извлечение части строки многострочного используя регулярное выражение

eth6.36 Link encap:Ethernet HWaddr A0:36:9F:5F:24:EE \r\n   inet addr:36.36.36.10 Bcast:36.36.36.255 Mask:255.255.255.0\r\n   inet6 addr: fe80::a236:9fff:fe5f:24ee/64 

Когда я пытаюсь извлечь только eth6.36 Link encap, я получаю сообщение об ошибке.

test = 'ifconfig eth6.36\r\neth6.36 Link encap:Ethernet HWaddr A0:36:9F:5F:24:EE \r\n   inet addr:36.36.36.10 Bcast:36.36.36.255 Mask:255.255.255.0\r\n   inet6 addr: fe80::a236:9fff:fe5f:24ee/64 Scope:Link\r\n   UP BROADCAST MULTICAST MTU:9000 Metric:1\r\n   RX packets:0 errors:0 dropped:0 overruns:0 frame:0\r\n   TX packets:62 errors:0 dropped:0 overruns:0 carrier:0\r\n   collisions:0 txqueuelen:0 \r\n   RX bytes:0 (0.0 b) TX bytes:7004 (6.8 KiB)\r\n\r\n' 

match = re.match('(eth6.36\sLink encap:)', test) 
print match.groups() 
... 
AttributeError: 'NoneType' object has no attribute 'groups' 

Любые идеи, пожалуйста?

+0

Какая ошибка? можете ли вы поделиться им? – Giordano

+0

@Giordano: 'match' будет' None', поскольку regexp ничего не соответствует. Затем следующая строка вызовет 'AttributeError', поскольку' None' не имеет атрибута 'groups'. Я взял на себя смелость добавить это к вопросу. –

ответ

0

Использовать findall вместо multiline. Вам также нужен квантификатор для \s.

>>> re.findall(r'(eth6.36\s+Link encap:)',test, re.M) 
['eth6.36 Link encap:'] 

Если вы уверены, что только один результат придет использовать search и удалить группировку круглых скобок:

>>> re.search(r'eth6.36\s+Link encap:',test).group() 
'eth6.36 Link encap:' 
1

re.match матчи с начала строки. Используйте re.search вместо как это соответствует где-нибудь в строке:

>>> match = re.search('(eth6.36\s+Link encap:)', test) 
>>> print match.groups() 
('eth6.36 Link encap:',) 

Кроме того, вы должны указать, что несколько пробельных символов совпадают: \s+ (отметьте +).

1

Вы хотите этого, Был ошибка в формировании регулярных выражений

import re 
test = 'ifconfig eth6.36\r\neth6.36 Link encap:Ethernet HWaddr A0:36:9F:5F:24:EE \r\n   inet addr:36.36.36.10 Bcast:36.36.36.255 Mask:255.255.255.0\r\n   inet6 addr: fe80::a236:9fff:fe5f:24ee/64 Scope:Link\r\n   UP BROADCAST MULTICAST MTU:9000 Metric:1\r\n   RX packets:0 errors:0 dropped:0 overruns:0 frame:0\r\n   TX packets:62 errors:0 dropped:0 overruns:0 carrier:0\r\n   collisions:0 txqueuelen:0 \r\n   RX bytes:0 (0.0 b) TX bytes:7004 (6.8 KiB)\r\n\r\n' 

match = re.search('(eth6\.36\s*Link encap:)', test) 
print match.groups() 

Выход

('eth6.36 Link encap:',) 
+1

Я заметил, что вы выбрали точку в поисковом регулярном выражении, а другие - нет. Они что-то упускают? считается ли точка meta в этой строке, если она не сбежала? –

+2

Они ничего не пропустили. «.» Заменяет один символ. В их случае он совпадает с самой '.' (он может соответствовать любому другому). В моем случае он заменяется на '.' точно –

Смежные вопросы