2017-05-09 36 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演示很好,但如果你将演示和结果放在帖子中,那将会很好。 –

相关问题