2016-06-26 3 views
2

Это мой первый пост. Я всегда прихожу на этот форум, ища ответ, когда дело доходит до кода.specific Regular search search python

Я боролся с пониманием регулярных выражений в Python, но это довольно сложно.

У меня есть текст, который выглядит следующим образом:

Name: Clash1 
Distance: -1.341m 
Image Location: Test 1_navis_files\cd000001.jpg 
HardStatus: New 
Clash Point: 3.884m, -2.474m, 2.659m 
Date Created: 2016/6/2422:45:09 

Item 1 
GUID: 6efaec51-b699-4d5a-b947-505a69c31d52 
Path: File ->Colisiones_v2015.dwfx ->Segment ->Pipes (1) ->Pipe Types (1) ->Default (1) ->Pipe Types [2463] ->Shell 
Item Name: Pipe Types [2463] 
Item Type: Shell 

Item 2 
GUID: 6efaec51-b699-4d5a-b947-505a69c31dea 
Path: File ->Colisiones_v2015.dwfx ->Segment ->Walls (4) ->Basic Wall (4) ->Wall 1 (4) ->Basic Wall [2343] ->Shell 
Item Name: Basic Wall [2343] 
Item Type: Shell 

------------------ 


Name: Clash2 
Distance: -1.341m 
Image Location: Test 1_navis_files\cd000002.jpg 
HardStatus: New 
Clash Point: 3.884m, 3.533m, 2.659m 
Date Created: 2016/6/2422:45:09 

Item 1 
GUID: 6efaec51-b699-4d5a-b947-505a69c31d52 
Path: File ->Colisiones_v2015.dwfx ->Segment ->Pipes (1) ->Pipe Types (1) ->Default (1) ->Pipe Types [2463] ->Shell 
Item Name: Pipe Types [2463] 
Item Type: Shell 

Item 2 
GUID: 6efaec51-b699-4d5a-b947-505a69c31de8 
Path: File ->Colisiones_v2015.dwfx ->Segment ->Walls (4) ->Basic Wall (4) ->Wall 1 (4) ->Basic Wall [2341] ->Shell 
Item Name: Basic Wall [2341] 
Item Type: Shell 

------------------ 

Что мне нужно сделать, чтобы создать список, который извлекает для каждого фрагмента текста (разделенного -------------------------------) следующих вещей как строка: имя и столкновение.

Например: Clash 1 3.884, 3.533, 2.659

Я действительно новичок в Python, и на самом деле не так много понимания регулярных выражений.

Может ли кто-нибудь дать мне несколько подсказок об использовании регулярных выражений, чтобы извлечь эти значения из текста?

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

exp = r'(?<=Clash Point\s)(?<=Point\s)([0-9]*)' 
match = re.findall(exp, html) 

if match: 
    OUT.append(match) 
else: 
    OUT = 'fail' 

, но я знаю, что я далеко от своей цели.

ответ

0
import re 


lines = s.split('\n') 

names = [] 
points = [] 

for line in lines:  
    result = re.search('^Name:\s*(\w+)', line) 
    if result: 
     names.append(result.group(1)) 

    result = re.search('^Clash Point:\s*([-0-9m., ]+)',line) 
    if result: 
     points.append(result.group(1)) 

print(names) 
print(points) 

# if you need more nice output, you can use zip() function 
for name, point in zip(names, points): 
    print(name, point) 

Вы можете найти полезную информацию о регулярных выражениях на regexr.com. Кроме того, я использую его для быстрого тестирования и ссылки.

1

Если вы ищете решение, регулярное выражение, можно придумать:

^Name:\s*   # look for Name:, followed by whitespaces 
        # at the beginning of a line 
(?P<name>.+)  # capture the rest of the line 
        # in a group called "name" 
[\s\S]+?   # anything afterwards lazily 
^Clash\ Point:\s* # same construct as above 
(?P<point>.+)  # same as the other group 

См a demo on regex101.com.


Перевод в Python кода, это было бы:

import re 
rx = re.compile(r""" 
       ^Name:\s* 
       (?P<name>.+) 
       [\s\S]+? 
       ^Clash\ Point:\s* 
       (?P<point>.+)""", re.VERBOSE|re.MULTILINE) 

for match in rx.finditer(your_string_here): 
    print match.group('name') 
    print match.group('point') 

Это Выведет:

Clash1 
3.884m, -2.474m, 2.659m 
Clash2 
3.884m, 3.533m, 2.659m 

См a working demo on ideone.com.