如何解决RegEx 中的负向后视:一次匹配多个 POS 标签
我对正则表达式还很陌生,所以我很感激任何帮助。 我正在尝试使用正则表达式在使用 CLAWS7 标签集进行词性标记的文本语料库中查找特定的语法模式。 这是一个示例:
Ya_UH and_CC then_RT uhm_NN1 we_PPIS2 wrote_VVD in_RP but_CCB already_RR taken_VVN up_RP that_DD1 day_NNT1 that_CST we_PPIS2 wanted_VVD actually_RR they_PPHS2 said_VVD still_RR available_JJ you_PPY kNow_VV0 so_RR by_II that_DD1 time_NNT1 we_PPIS2 we_PPIS2 write_VV0 in_II our_APPGE letter_NN1 two_MC weeks_NNT2 later_RRR already_RR taken_VVN up_RP Quite_RG good_RR uh_UH P ICE-SIN: S1A-001#74:1:B Ask_VV0 her_PPHO1 I_PPIS1 left_VVD my_APPGE house_NN1 at_II one_MC1 met_VVD PRO_NN1 in_II school_NN1 at_II 二_MC Ya_PPY 所以_RR 等_VVD 你_PPY 知道_VV0 他们_PPHS2 说_VV0 half_DB 小时_NNT1 以后_RRR And_CC and_CC it_PPH1 was_VBDZ 还是_RR毛毛雨_JJ和_CC下雨_VVG
我正在寻找的模式是\w*\_V.*?
(=每个动词)的每个实例,它非以代词开头。代词可以有以下标签:
_PN _PN1 _PNQO _PNQS _PNQV _PNX1 _PPGE _PPH1 _PPHO1 _PPHO2 _PPHS2 _PPIO1 _PPIO2 _PPIS1 _PPIS2 _ppx1 _ppx2 _PPY
在示例中,理想的正则表达式应该匹配:
taken_VVN
met_VVD
Ask_VV0
waited_VVD
raining_VVG
使用否定的lookbehind,我设法创建了以下表达式,它只匹配前面没有_PPIS2标签的动词:
(?<!\_PPIS2)\s\w*\_V.*?
我该怎么做才能将其扩展到所有其他代词标签?我试过下面的表达式,但它们要么根本不匹配,要么匹配错误的实例。
(?<!\_P.*)\s\w*\_V.*? (no match)
(?<![\_P.*])\s\w*\_V.*? (wrong results)
任何想法或解释将不胜感激。
解决方法
也许会有更智能的模式,但使用 Sublime Text 3,您可以使用 (*SKIP)(*F)
的组合来首先匹配您不想要的内容,丢弃那些匹配的内容,然后匹配您想要的内容:
_P(?:N(?:X?1|Q[OSV]|)|P(?:GE|H1|(?:[HI]O|IS|X)[12]|HS2|Y))\s\w+_V[A-Z0-9]*\b(*SKIP)(*F)|\w+_V[A-Z0-9]*\b
查看在线demo。由于您的所有单词都以下划线结尾,后跟适当的语法模式,因此我认为它应该符合您的需求。
,你可以在 sublime 中使用这个 PCRE 正则表达式:
\b\w*_P\w*\h+\w*_V\w*(*SKIP)(*F)|\b\w*_V\w*
正则表达式详情:
-
\b\w*_P\w*
:匹配包含_P
的单词 -
\h+
:匹配 1 个以上的空格 -
\w*_V\w*
:在任意位置匹配带有_V
的单词 -
(*SKIP)(*F)
:跳过匹配的子串并使其失败 -
|
:或 -
\b\w*_V\w*
:在任何地方匹配一个带有_V
的单词(这些是我们的匹配项)
你可以使用
\b(?:[^\W_]+_[^\W_]+ )?(?<!_PN |_PN1 |_PNQ[OVS] |_PNX1 |_PPGE |_PPH1 |_PPHO[12] |_PPHS2 |_PPIO[12] |_PPIS[12] |_PPX[12] |_PPY )[^\W_]*_V\w*
参见regex demo。
详情
-
\b
- 一个词边界 -
(?:[^\W_]+_[^\W_]+ )?
- 一个可选的序列-
[^\W_]+
- 一个或多个字母/数字 -
_
- 下划线 -
[^\W_]+
- 一个或多个字母/数字和一个空格
-
-
(?<!_PN |_PN1 |_PNQ[OVS] |_PNX1 |_PPGE |_PPH1 |_PPHO[12] |_PPHS2 |_PPIO[12] |_PPIS[12] |_PPX[12] |_PPY )
- 如果上面的任何模式立即出现在当前位置的左侧,则匹配失败的否定后视 -
[^\W_]*
- 零个或多个数字/字母 -
_V
-_V
字符串 -
\w*
- 任意零个或多个单词字符。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。