我仍然有一个工作的正则表达式模式。现在我发现了一个新的情况下,没有捕捉到我的第一个解决方案确实干扰了以前的情况。
我想提取一个字符串的三个部分。我使用Python3来完成这个任务,并且在regex101.com上进行了测试。
下面是一个示例输入字符串:
foo:bar][bluered
得到的子字符串应该是foo
、bar
和blured
。我可以通过RegEx模式(Python3)处理这个问题。
^(?:([^:]+):)?(.*?)(?:]\[(.*))?$
让我用自己的话来描述
:
之前的第一个子字符串(foo
)是可选的。该模式也适用于输入bar][bluered
。- 第二个和第三个应该在那里,并通过
][
划分。
问题
现在的问题情况是,第一个子串丢失,第三个子串包含:
。
bar][blue:red
模式给出了结果子串bar][blue
和red
,第三个子串被忽略。这里的 expected 结果是第一个空的子串,然后bar
作为第二个,blue:red
作为第三个。
我的方法
我添加了一个检查][
:
^(?:]\[([^:]+):)?(.*?)(?:]\[(.*))?$
^^^
这确实可以捕获像bar][blue:red
这样的输入。但是现在的问题是,第一个和第二个子串之间的:
被忽略了:
foo:bar][blue:red
结果是一个空的第一个子串,第二个是foo:bar
,第三个是blue:red
。我确实需要foo
作为第一个,bar
作为第二个,blue:red
作为第三个。
现在我有点困惑如何更进一步。我想我需要忽略第三组中][
之后的:
,即使第一组和第二组之间没有:
(在][
之前)。
我需要找到一个对两种类型的输入字符串都有效的解决方案
bar][blue:red
foo:bar][blue:red
- EDIT*:尝试了lookahead,但不起作用。只有在
][
之前,它才应该“意味着”匹配:
。
^(?:([^:]+(?=\]\[)):)?(.*?)(?:]\[(.*))?$
^^^^^^^^^
但也许这是正确的方向?
3条答案
按热度按时间c86crjj01#
为了便于解释,“特殊”字符被定义为
:[]
之一。试试on regex101.com。
如果要匹配
foo:bar:baz:boo
,则第二个捕获组应更改为([^[\]\n]*?)
(无冒号):试试on regex101.com。
de90aj5v2#
您可以Assert
][
不应该出现在第一个组中,对第一个捕获组中的每个位置使用负前瞻Assert:z9zf31ra3#
根据所提供的描述,我认为很简单
应该够了
它将找到最后一个
][
和它之前的:
(如果存在)。| 输入|第一场比赛|秒|第三|
| --------------|--------------|--------------|--------------|
| foo:bar]bluered|福|杆|发蓝的|
| foo:bar][blue:red|福|杆|蓝色:红色| | foobar][蓝色:红色||福巴|蓝色:红色|
| [红色||非洲广播电台|红色|
| foo:bar]blue:red][sdsd:df|foo:bar][蓝色|红色|sdsd:df|
演示here