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*

RegEx Demo

正则表达式详情:

  • \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* - 任意零个或多个单词字符。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...