代码之家  ›  专栏  ›  技术社区  ›  Zdiode

查找开始和停止之间的所有重复字符串,并使用分隔符

  •  1
  • Zdiode  · 技术社区  · 7 年前

    我试图从如下字符串中获取一个或多个子字符串:

    “开始:param1:param2:paramN:theEND”

    “开始:参数1:theEND”

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

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

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

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

    没有按预期工作。

    4 回复  |  直到 7 年前
        1
  •  3
  •   Samantha Atkins    7 年前

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

    def delimited_items(the_string):
      items = the_string.split(':')
      return items[1:-1]
    
        2
  •  0
  •   rolacher    7 年前

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

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

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

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

        3
  •  0
  •   Jack Homan    7 年前

    使用“.”捕获所有内容然后在定界符上拆分应该可以简化一些事情。

    params = re.match(r'theSTART:(.+):theEND', a).group(1).split(':')
    
        4
  •  0
  •   Community holdenweb    4 年前

    您可以使用 re.findall positive lookahead :

    在上查看演示 regex101

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

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

    这给了一个 list parameters :

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

    N、 B.有两个不同的笑脸 :)