查找开始和结束之间以及带有分隔符的所有重复字符串

Find all repeating strings between a start and a stop and with a separator

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

"theSTART:param1:param2:paramN:theEND"

"theSTART:param1:theEND"

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

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

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

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

没有按预期工作。

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

def delimited_items(the_string):
  items = the_string.split(':')
  return items[1:-1]

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

params = re.match(r'theSTART:(.+):theEND', a).group(1).split(':')

您可以将 re.findallpositive lookahead 一起使用:

查看 regex101

上的演示

上面的link会很好的解释下面的regex的每个部分是做什么的,但是如果你还是不明白,试试看原样的documentation很有用。

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

给出 listparameters:

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

N.B。里面有两个不同的笑脸:),很酷

如果您想使用正则表达式而不是拆分,

re.findall 可能是一个解决方案。 findall returns 一个模式所有出现的列表。

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

returns 列表 ['param1', 'param2', 'paramN'].

您可能不会(或不能)找到匹配任意数量参数的模式。根据Python re module documentation只是最后一个匹配可访问,如果一个组匹配多次。