python regex在字符串后获取值

时间:2017-05-09 12:29:24

标签: python regex

我正在尝试解析逗号分隔的字符串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://元素,但我不知道如何执行此操作更好地利用空间作为终点指标)。然而,这并不正确。如何使用正则表达式更好地做到这一点?

1 个答案:

答案 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']