在我得到的文本文件中,每个句子都用特定类型表示,例如:contrast。
对比句子可以用标签“CONTRAST”或“CONTR”或“WEAKCONTR”表示。例如:
IMPSENT_CONTRAST_VIS(以这种方式学习网络可以帮助你 识别个人从中学习的人,其中 conflicts_MD:理解_MD中的+:+可能是起源,哪个是 语境因素影响学习。)
所以我用下面的表达式计算这些:/(\_(WEAK))|(\_CONTRAST)|(\_CONTR(\_|\())/g
,它完全正常。
现在问题是一些句子用一个以上的对比标签来表达,例如CONTR& WEAKCONTR在一起。例如:
IMPSENT_CONTRAST_EMPH_WEAKCONTR_VIS(Studying_MD:+这样的网络 可以帮助识别_MD:+个人学习的人 ,insight_MD:+ in Understanding_MD:+可能来自,和 哪些背景因素会影响学习。)
此时我必须将这些数量计为1而不是2.您是否知道这对RegExp有多大可能?
答案 0 :(得分:1)
您可以使用前瞻来断言它,然后计算匹配项:
(?=\w*_(?:WEAK|CONTRAST|CONTR[_)]))\b\w+\b
在这里演示:http://regex101.com/r/xP2yI7/3
注意匹配计数。
这将匹配整个IMPSENT_CONTRAST_EMPH_WEAKCONTR_VIS
表达式,但前提是它与前瞻中的部分匹配,后者会过滤您正在关注的关键字。即使你在同一行上有多个这样的句子,这也会匹配。
另外,我已经简化了你的正则表达式,保留了相同的含义。请注意,您不必转义_
。
答案 1 :(得分:1)
你真的只关心标签是否显示在行中,所以只要抓住整行,只要它有标签,就像这样:
/^([A-Z_]+(WEAK|CONTRAST|CONTR)+[A-Z_]*)/gm
从 ^ 一行开始,查找带有 AZ 或 _ 的字块,然后是标记,可选地后跟更多字词/下划线
答案 2 :(得分:0)
您可以尝试添加\w+
:
/(\_(WEAK\w+))|(\_CONTRAST\w+)|(\_CONTR(\_\w+|\())/g
答案 3 :(得分:0)
这样的东西?
(^(\_(WEAK))|(\_CONTRAST)|(\_CONTR(\_|\()))