我有一个字符串,试图匹配单词模式,这些单词模式直接出现在标记之后,也可能出现在标记之后。例如:
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对测试很有帮助。
答案 0 :(得分:2)
这是同时匹配两个~~...~~
个单词的解决方案:
(?<=\[TAG\])( \w*)? ~~\w*~~
[TAG]
。~
~
个单词。如果它们之间也有一个单词也会被匹配,因此您可以将第二个单词分组或拆分结果并使用最后一个索引。
要包含CONNECT
个示例,只需or
是同一件事:
(?<=\[TAG\])( \w*)? ~~\w*~~|(?<=\[CONNECT\])( \w*)? ~~\w*~~
这是正则表达式的确切含义,但是后面的内容需要恒定的宽度。如果您不介意与TAG匹配,则可以将其缩短为:
\[(TAG|CONNECT)\]( \w*)? ~~\w*~~
仅当您期望有更多~~LettersAndDigits~~
个单词时才需要使用此选项。如果没有,您可以精确搜索
~~\w*~~
没有任何幻想。
最终添加
确保两个TAG
和CONNECT
都出现(可选连接):
\[TAG\]( \w*)?( \[CONNECT\]( \w*)?)? ~~[\w]*~~
这里是fiddle。在这种情况下,只有匹配的单词长度可变,因此我只能使用()
分组。