非捕获组仍在捕获
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)
你的正则表达式还不错,只是转义管道 |
因为它是正则表达式中的特殊字符:
(\w+_(?:PP$\|DT)(?:\w+_JJ)(\w+__(?:NN\|NNS)))
// here __^ and here __^
我正在尝试制作一个正则表达式来匹配 _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)
你的正则表达式还不错,只是转义管道 |
因为它是正则表达式中的特殊字符:
(\w+_(?:PP$\|DT)(?:\w+_JJ)(\w+__(?:NN\|NNS)))
// here __^ and here __^