1

我试图从这样的字符串中获取一个或多个子字符串:

“开始:参数 1:参数 2:参数 N:结束”

或者

“开始:param1:结束”

或由“:”分隔并由“theSTART:”和“:theEND”分隔的任意数量的参数。我正在使用 Python3 正则表达式,但我找不到正确的模式来匹配可变数量的项目:

r"theSTART:((?:\w*)+):((?:[^:])*):((?:\w)+):theEND"

仅适用于 3 个项目。如果我尝试:

r"theSTART:((?:\w*)+):(((?:[^:])*):)+((?:\w)+):theEND"

没有按预期工作。

4

4 回答 4

3

好吧,如果您的数据总是以“theStart”开头,以“theEnd”结尾,并且所有字段都以“:”分隔,那么为什么还要用正则表达式来解决这个问题呢?为什么不只是:

def delimited_items(the_string):
  items = the_string.split(':')
  return items[1:-1]
于 2017-11-06T00:39:26.643 回答
0

使用“。”捕获所有内容 然后在分隔符上拆分应该会简化一些事情。

params = re.match(r'theSTART:(.+):theEND', a).group(1).split(':')
于 2017-11-06T20:27:05.143 回答
0

如果您想使用正则表达式而不是拆分,re.findall 可能是一个解决方案。findall 返回一个模式的所有出现的列表。

re.findall(r":(?:(\w+)(?=:))", r"theSTART:param1:param2:paramN:theEND")

返回列表['param1', 'param2', 'paramN']

您可能不会(或无法)找到匹配任意数量参数的模式。根据 Python re 模块文档,如果一个组匹配多次,则只有最后一个可访问的匹配项。

于 2017-11-06T21:10:38.093 回答
0

您可以re.findall使用positive lookahead

查看演示regex101

上面的链接将很好地解释regex下面每个部分的详细功能,但是如果您仍然不确定,请尝试阅读,documentation因为它非常有用。

s = "theSTART:param1:param2:paramN:theEND"
re.findall(":(.+?)(?=:)", s)

这给出了list一个parameters

['param1', 'param2', 'paramN']

注意这里有两个不同的笑脸:),很酷

于 2017-11-06T20:42:36.057 回答