如何在同一行中将两个单词计为一个?涉及IT技术。

3
在我拥有的文本文件中,每个句子都用特定类型表示,比如:对比句。对比句可以用“CONTRAST”、“CONTR”或“WEAKCONTR”标记来表示。例如:
IMPSENT_CONTRAST_VIS(Studying networks in this way can help to identify the people from whom an individual learns, where conflicts_MD:+ in understanding_MD:+ may originate, and which contextual factors influence learning.)
因此,我使用以下表达式进行计数:/(\_(WEAK))|(\_CONTRAST)|(\_CONTR(\_|\())/g,这个表达式完美地解决了问题。
现在的问题是,有些句子用了多个对比标签,例如:CONTR和WEAKCONTR一起使用。例如:
IMPSENT_CONTRAST_EMPH_WEAKCONTR_VIS(Studying_MD:+ networks in this way can help to identify_MD:+ the people from whom an individual learns, where conflicts_MD:+ in understanding_MD:+ may originate, and which contextual factors influence learning.)
此时,我必须将其视为1而不是2进行计数。您有没有想法如何使用RegExp实现这一点?

标签总是在行首并跟随括号吗? - Evan Davis
1
为什么你需要准确的“CONTR”标签数量?知道有一个这样的标签存在不就足够了吗?只是好奇... - wroniasty
@Mathletics 标签可以用括号或下划线表示,标签始终以下划线开头,例如_CONTR(或_CONTR_。 - dsimsek
@wroniasty 我认为重点不是返回确切的数字,而是找到任何带有标签的行,并且只记录每行一次。 - Evan Davis
@wroniasty,我想知道有多少句子提到了对比的观点。这些观点用我上面写的3个标签表示,但有时同一句话包含2个对比标签,这会导致我将1个句子计算为2个。希望清楚明白。 - dsimsek
一次处理一行/句子是一个选项吗? - wroniasty
4个回答

1
你可以使用先行断言来进行断言,然后计算匹配次数:
(?=\w*_(?:WEAK|CONTRAST|CONTR[_)]))\b\w+\b

这里有个演示:http://regex101.com/r/xP2yI7/3
注意匹配数量。

这将匹配整个IMPSENT_CONTRAST_EMPH_WEAKCONTR_VIS表达式,但仅当它匹配前瞻部分时才会匹配,该前瞻部分过滤您要查找的关键字。即使在同一行上有多个这样的句子,这也将匹配。

此外,我简化了您的正则表达式,保留了相同的含义。请注意,您不必转义_


它运行了!非常感谢。我不能给你点赞,因为需要15个声望,抱歉 :) - dsimsek

1
你真正关心的只是标签是否出现在整行中,所以只需获取整行,只要它具有标签就可以了,就像这样:
/^([A-Z_]+(WEAK|CONTRAST|CONTR)+[A-Z_]*)/gm

从行首开始^,寻找包含A-Z_的单词块,后跟标签,可选择跟随更多单词/下划线。

DEMO


0

你可以尝试添加\w+吗:

/(\_(WEAK\w+))|(\_CONTRAST\w+)|(\_CONTR(\_\w+|\())/g

0

像这样吗?

(^(\_(WEAK))|(\_CONTRAST)|(\_CONTR(\_|\()))

这个答案出现在低质量审核队列中,可能是因为您没有解释代码。如果您在回答中解释了它,您很有可能会获得更多的赞同,并且提问者实际上也会学到一些东西! - The Guy with The Hat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接