正则表达式-比赛后捕获单词

时间:2018-07-04 09:26:58

标签: python regex

我有一个字符串,试图匹配单词模式,这些单词模式直接出现在标记之后,也可能出现在标记之后。例如:

after_tag = r'here is sentence as an example where a [TAG] ~~M001~~ a word'
one_after_tag = r'here is sentence as an example where a [TAG] can ~~M001~~ a word'

我也想扩展此功能以使其与连接词配合使用,并且也已被标记。这也应该在[CONNECT]标记后的一两个字的窗口内工作,例如:

after_connect = r'here is a sentence where a [TAG] could [CONNECT] ~~M002~~'
one_after_connect = r'here is a sentence where a [TAG] could [CONNECT] a ~~M002~~'

我用Python中的re软件包尝试了以下正则表达式。

regex_current = re.compile(((?:(?<=(\{TAG})))(.*?)\~\~[A-Z0-9]{4,5}\~\~))

任何人都可以帮忙吗?我发现以下website对测试很有帮助。

1 个答案:

答案 0 :(得分:2)

这是同时匹配两个~~...~~个单词的解决方案:

(?<=\[TAG\])( \w*)? ~~\w*~~
  1. 在比赛之前寻找[TAG]
  2. 匹配一个或更少的单词而没有~
  3. 匹配~个单词。

如果它们之间也有一个单词也会被匹配,因此您可以将第二个单词分组或拆分结果并使用最后一个索引。

Here is the example

要包含CONNECT个示例,只需or是同一件事:

(?<=\[TAG\])( \w*)? ~~\w*~~|(?<=\[CONNECT\])( \w*)? ~~\w*~~

这是正则表达式的确切含义,但是后面的内容需要恒定的宽度。如果您不介意与TAG匹配,则可以将其缩短为:

\[(TAG|CONNECT)\]( \w*)? ~~\w*~~

仅当您期望有更多~~LettersAndDigits~~个单词时才需要使用此选项。如果没有,您可以精确搜索

~~\w*~~

没有任何幻想。

最终添加

确保两个TAGCONNECT都出现(可选连接):

\[TAG\]( \w*)?( \[CONNECT\]( \w*)?)? ~~[\w]*~~

这里是fiddle。在这种情况下,只有匹配的单词长度可变,因此我只能使用()分组。