查找开始和结束之间以及带有分隔符的所有重复字符串
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.findall
与 positive lookahead
一起使用:
查看 regex101
上的演示
上面的link会很好的解释下面的regex
的每个部分是做什么的,但是如果你还是不明白,试试看原样的documentation
很有用。
s = "theSTART:param1:param2:paramN:theEND"
re.findall(":(.+?)(?=:)", s)
给出 list
的 parameters
:
['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只是最后一个匹配可访问,如果一个组匹配多次。
我正在尝试从这样的字符串中获取一个或多个子字符串:
"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.findall
与 positive lookahead
一起使用:
查看 regex101
上面的link会很好的解释下面的regex
的每个部分是做什么的,但是如果你还是不明白,试试看原样的documentation
很有用。
s = "theSTART:param1:param2:paramN:theEND"
re.findall(":(.+?)(?=:)", s)
给出 list
的 parameters
:
['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只是最后一个匹配可访问,如果一个组匹配多次。