非捕获组仍在捕获

Non-capture group still capturing

我正在尝试制作一个正则表达式来匹配 _TAG(_DT、_NN 等)部分,按照它们出现的顺序,一个句子的以下所有变体:

Her_PP$|DT noun_NN|NNS a_PP$|DT noun_NN|NNS
Her_PP$|DT adj_JJ noun_NN|NNS a_PP$|DT noun_NN|NNS
Her_PP$|DT noun_NN|NNS a_PP$|DT adj_JJ noun_NN|NNS
Her_PP$|DT adj_JJ noun_NN|NNS a_PP$|DT adj_JJ noun_NN|NNS

这是原文的显示方式,我只是想突出显示匹配项。竖线 |在上下文中确实意味着 "or",所以请像正常的 "or."

一样将其包含在正则表达式中

如您所见,其中每一个的基本框架是 Her_PP$|DT noun_NN|NNS a_PP$|DT noun_NN|NNS,其中一些 _JJ 碎片散落在各处。我想要一个正则表达式来捕捉所有这些,但我似乎无法使用可选字符串来制作一个正则表达式。

_PP$|DT 并不总是跟在 _JJ 后面,所以我想将 _JJ 设置为可选的,但它每次都找到它并且永远找不到 _PP$|DT _NN_PP$|DT _JJ _NN. 这是我的字符串:

(\w+_(?:PP$|DT)(?:\w+_JJ)(\w+__(?:NN|NNS)))   

对于那些想知道的人,_PP$ 等是附加在单词末尾的词性标记(例如,NN 表示 "noun",因此您可能会看到 "dog_NN").

很抱歉我是这方面的初学者,所以请耐心等待! :)

(?:xyz) 表示匹配 xyz 但不要捕获它。

如果您想将某些内容设为可选,您必须将 ? 添加到该组。

在你的情况下..正则表达式是

((\w+_(PP$|DT)(\s\w+_JJ)*?(\s\w+_(NN|NNS))\s?){2})

您可以使用前瞻来测试各种条件:

^(?=.*_PP$|DT)(?=(?:.*_JJ)?)

^                               start of string
    ^^^^                        First condition
                  ^^^^^         Optional second condition

然后捕获到 _NN 的所有内容:

^(?=_PP$\|DT)(?=(?:.*_JJ)?)(.*_NN)

Demo

你的正则表达式还不错,只是转义管道 | 因为它是正则表达式中的特殊字符:

(\w+_(?:PP$\|DT)(?:\w+_JJ)(\w+__(?:NN\|NNS)))
//   here __^              and here __^