我正在尝试解析逗号分隔的字符串keyword:// pass @ ip:port。 该字符串是逗号分隔的字符串,但密码可以包含任何字符,包括逗号。因此我不能使用基于逗号的拆分操作作为分隔符。
我尝试使用正则表达式来获取" myserver://"之后的字符串。然后我可以通过使用字符串操作(传递@ ip:port / key1)来拆分其余的信息,但我无法使其工作,因为我无法在上述关键字后获取信息。
myserver://是一个硬编码的字符串,我需要得到每个myserver后面的任何内容作为逗号分隔列表(即传递@ ip:port / key1,pass2 @ ip2:port2 / key2等)
这是我能得到的最接近的:
import re
my_servers="myserver://password,123@ip:port/key1,myserver://pass2@ip2:port2/key2"
result = re.search(r'myserver:\/\/(.*)[,(.*)|\s]', my_servers)
使用搜索我试图找到" myserver://"关键字后跟任何字符,以逗号结尾(表示它将跟随myserver:// zzz,myserver:// qqq)或空格(包含单个myserver://元素,但我不知道如何执行此操作更好地利用空间作为终点指标)。然而,这并不正确。如何使用正则表达式更好地做到这一点?
答案 0 :(得分: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://
- 文字子字符串(.*?)
- 捕获第1组,其内容将由re.findall
返回,与换行符之外的任何0 +字符匹配,尽可能少,直到第一次出现(但不包括它)< / LI>
(?=\s*,\s*myserver://|$)
- 两种选择中的任何一种:
\s*,\s*myserver://
- ,
附有0 +空格,然后是文字myserver://
子字符串|
- 或$
- 字符串结束。这是regex demo。
查看Python demo for the both approaches:
import re
s = "myserver://password,123@ip:port/key1,myserver://pass2@ip2: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,123@ip:port/key1', 'pass2@ip2:port2/key2']
。