2015-06-09 7 views
1

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

Это моя свалка

Ack_ONE............................FAILED 
[58] 0 
[59] 0 
[5A] 0 
[5B] 0 
dropball.....................................PASSED 
[email protected]: Error: TX 0x00A9EFB6  
MAKEPIE.....................................FAILED 

Я пытаюсь извлечь команду, используя следующий матч. Чтобы у меня были тесты (Ack_ONE, dropball, Makepie) как match.groups()[0] и результаты (FAILED, PASSED, FAILED) в match.groups()[1].

Ack_ONE FAILED 
dropball PASSED 
Makepie FAILED 

Я использую следующую команду регулярок

match = re.search(r'\s*([a-zA-Z_0-9]+)............................(.*?)\n', line) 

Как я могу удалить/игнорировать . (точки) с использованием регулярных выражений и улучшить выше?

+1

'' ............................ вы можете заменить это '\. {5,}' или '\. {10.}' – vks

+0

Фактически количество точек зависит от каждого теста. Поэтому я хочу написать регулярное выражение, которое просто игнорирует все точки и просто дает имя теста и результат. – user2532296

ответ

1

Обратите внимание, что точки означают «любой символ», поэтому ваше регулярное выражение соответствует, например:

dropball....r34....(...dfsd.....6.....tyu....PASSED 

Вы должны избежать ., если вы хотите, чтобы соответствовать буквальной точке.

Таким образом, вы можете иметь:

match = re.search(r'\s*(\w+)\.{28}(.*?)\n', line) 
  • \w совпадает с любым символом слова

  • \.{28} матчи 28 точек (вы можете расширить его {x,y}, чтобы соответствовать между x и y точками, или если вам не важно, сколько точек может появиться, вы можете просто использовать \.+). Если вы хотите игнорировать точки, используйте \.*.

0
\s*([a-zA-Z_0-9]+)\.{5,}(.*?)(?:\n|$) 

Вы можете использовать это с re.findall, чтобы получить results.See демо.

https://regex101.com/r/nS2lT4/35

import re 
p = re.compile(r'\s*([a-zA-Z_0-9]+)\.{5,}(.*?)(?:\n|$)', re.MULTILINE) 
test_str = "Ack_ONE............................FAILED\n[58] 0\n[59] 0\n[5A] 0\n[5B] 0\ndropball.....................................PASSED\[email protected]: Error: TX 0x00A9EFB6 \nMAKEPIE.....................................FAILED" 

re.findall(p, test_str) 
0

Это мое решение проблемы.

import re 

text = ''' 
Ack_ONE............................FAILED 
[58] 0 
[59] 0 
[5A] 0 
[5B] 0 
dropball.....................................PASSED 
[email protected]: Error: TX 0x00A9EFB6  
MAKEPIE.....................................FAILED 
''' 

data = text.split('\n') 
for item in data: 
    if '...' in item: 
     print re.findall(r'[^.]+.', item) 

Он печатает:

['Ack_ONE.', 'FAILED'] 
['dropball.', 'PASSED'] 
['MAKEPIE.', 'FAILED']