2017-09-26 57 views
0

我想使用子函數來格式化字符串 「Ross McFluff:0456-45324:155 Elm Street \ nRonald Heathmore:5543-23464:445 Finley Avenue」。更多正則表達式解決方案?

每個人就應該是這樣的:

Contact 
Name: xx yy 
Phone number: 0000-00000 
Address: 000 zzz zzz 

我試圖解決這個問題:

line = """Ross McFluff: 0456-45324: 155 Elm Street \nRonald Heathmore: 5543-23464: 445 Finley Avenue""" 
match = re.sub(r':', r'', line) 
rematch = re.sub(r'([A-Z][a-z]+\s[A-Z][a-zA-Z]+)(.*?)(\d\d\d\d-\d\d\d\d\d)', r'Contact. Name: \1. Phone number: \3. Address:\2', match) 

我得到了這樣的事情:

"Contact. Name: Ross McFluff. Phone number: 0456-45324. Address: 155 Elm Street \nContact. Name: Ronald Heathmore. Phone number: 5543-23464. Address: 445 Finley Avenue" 

哪有我做得到這個結果:

Contact 
Name: Ross McFluff 
Phone number: 0456-45324 
Address: 155 Elm Street 
Contact 
Name: Ronald Heathmore 
Phone number: 5543-23464 
Address: 445 Finley Avenue 

有什麼想法?感謝 /喬治

+1

您不必使用正則表達式,它是一個非常簡單的csv。你可以一行一行讀取字符串,並用':'分割它。 –

+0

我知道,但是我想用正則表達式來解決這個問題;) –

回答

1

我會折騰的分裂在有這樣的:

import re 

data = """Ross McFluff: 0456-45324: 155 Elm Street \nRonald Heathmore: 5543-23464: 445 Finley Avenue""" 
linelist = data.split("\n") 
for theline in linelist: 
    rematch = re.sub('([^:]+): ([^:]+): (.*)', r'Contact\nName: \1\nPhone Number: \2\nAddress: \3', theline) 
    print (rematch) 

結果:

Contact 
Name: Ross McFluff 
Phone Number: 0456-45324 
Address: 155 Elm Street 
Contact 
Name: Ronald Heathmore 
Phone Number: 5543-23464 
Address: 445 Finley Avenue 

這樣,你可以很容易地處理每個 「行」。我真的很喜歡使用的東西,如:

([^:]+) 

這是一個負面人物類,它不匹配的是什麼類,因爲這是真的,你在做什麼。我想你也可以在冒號上做分割,但是你可能需要使用像這樣的正則表達式來進行更多的控制。你可能不得不使用trim來確保所有的空格都被清理掉了,這實際上取決於你正在處理的數據。

如果你需要去同一個純粹的正則表達式的解決方案,它可以通過只是擺弄周圍就在這裏完成:https://regex101.com/

0

我傾向於當我可以更喜歡大小說明,我不知道如何你的第一個響應回來正確,我假設這只是一個奇怪的異常,但下面是一個查詢應該工作。您的值將是\ 1,\ 3和\ 5用於名稱號碼和地址。這應該在讀取字符串末尾的地址時起作用。 (我使用通用分析器進行測試)

([A-Z][a-z]+\s[A-Z][a-zA-Z]+)(.*?)(\d{4}-\d{5})(.*?)([\w+ ]+)