2016-06-26 10 views
2

これは私の最初の投稿です。 私はいつもこのフォーラムに来て、コードに関して答えを探しています。特定の正規表現の検索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を参照してください。