2017-05-09 56 views
1

我想解析一個逗號分隔的字符串關鍵字:// pass @ ip:port。 該字符串是逗號分隔的字符串,但密碼可以包含任何字符,包括逗號。因此我無法使用基於逗號作爲分隔符的拆分操作。Python的正則表達式在字符串後得到值

我試圖使用正則表達式來獲取「myserver://」後面的字符串,後來我可以通過使用字符串操作(pass @ ip:port/key1)分割剩餘的信息,但是我無法做到它工作,因爲我無法獲取上述關鍵字後的信息。

MYSERVER://是一個硬編碼字符串,我需要得到什麼如下每個MYSERVER作爲一個逗號分隔的列表(即通@ IP:端口/ KEY1,PASS2 @ IP2:端口2/KEY2等)

這是最接近我可以得到:

import re 
my_servers="myserver://password,[email protected]:port/key1,myserver://[email protected]:port2/key2" 
result = re.search(r'myserver:\/\/(.*)[,(.*)|\s]', my_servers) 

使用搜索我試圖找到發生「MYSERVER://」關鍵字,然後任意字符,並用逗號結尾(意味着它也會跟着MYSERVER :// zzz,myserver:// qqq)或空格(單個myserver://元素的內存,但我不知道如何更好地使用空間作爲結束指示符)。然而,這並不正確。我怎樣才能更好地使用正則表達式?

+0

'myserver'是硬編碼的字符串嗎?你需要獲得'[「密碼,123 @ ip:port/key1」,「pass2 @ ip2:port2/key2」]? –

+0

yes imyserver是一個硬編碼字符串,我需要準確地得到「password,123 @ ip:port/key1」和「pass2 @ ip2:port2/key2」(對於服務器逗號分隔的字符串,或者「pass @ ip:port /鍵「,如果它只包含字符串中的信息)@WiktorStribiżew – heike

+1

請參閱https://ideone.com/JEBXVX - 像這樣? 1)'[['password','123 @ ip:port/key1'],['pass2 @ ip2:port2/key2']]或者2) '['password,123 @ ip:port/key1' ,'pass2 @ ip2:port2/key2']'?對不起,你太冗長了。你的輸入沒有'pass @ ip:port/key1'子字符串。 –

回答

2

您可以考慮以下方法拆分,如果你不需要保持myserver://在:

filter(None, re.split(r'\s*,?\s*myserver://', s)) 

\s*,?\s*myserver://圖相匹配的可選,附帶0+空格,然後myserver://子。見this regex demo。請注意,我們需要刪除空條目以排除空頭條目,因爲在字符串start處找到匹配項時,開頭處的空字符串將被添加到結果列表中。

或者,你可以使用一個懶點匹配模式先行基於模式與re.findall

rx = r"myserver://(.*?)(?=\s*,\s*myserver://|$)" 

Python demo

詳細

  • myserver:// - 字面子串
  • (.*?) - 捕捉其內容將被re.findall被返回的匹配比換行符字符以外的任何字符0+組1,儘可能少,直至第一次出現(但不包括它)
  • (?=\s*,\s*myserver://|$) - 無論是2個的替代品:
    • \s*,\s*myserver:// - ,包圍0+空格然後字面myserver://
    • | - 或
    • $ - 字符串的結尾。

這裏是regex demo

看到一個Python demo for the both approaches

import re 

s = "myserver://password,[email protected]:port/key1,myserver://[email protected]:port2/key2" 

rx1 = r'\s*,?\s*myserver://' 
res1 = filter(None, re.split(rx1, s)) 
print(res1) 

#or 
rx2 = r"myserver://(.*?)(?=\s*,\s*myserver://|$)" 
res2 = re.findall(rx2, s) 
print(res2) 

雙方將打印['password,[email protected]:port/key1', '[email protected]:port2/key2']

+1

哇,很好的答案。 – Sraw

+0

Python演示很好,但如果你將演示和結果放在帖子中,那將會很好。 –

相關問題