我正在尝试为Rapidminer中的Tokenizer
运算符查找正则表达式。
现在,我要做的是将文本分成两个词的一部分。
例如,That was a good movie.
的结果应为That was
,was a
,a good
,good movie
。
在分词器中正则表达式的特殊之处在于它扮演定界符的角色,因此您匹配分割点而不是要保留的内容。
因此,首先想到的是使用\s
以便在空白处进行拆分,但这将导致分别获取每个单词。
所以,我的问题是如何强制表达式以某种方式跳过两个空白之一?
答案 0 :(得分:1)
首先,我们可以使用\ W来标识分隔单词的字符。为了删除它们的多个连续实例,我们将使用:
\W+
请记住,您想每两个实例拆分一次包含在“ \ W +”表达式中的字符。因此,结果必须是具有以下形式的字符串:
<a "word"> <separators that are matched by the pattern "\W+"> <another "word">
这意味着,从请求的拆分中获得的每个令牌都必须使用“ \ W +”模式进一步拆分,以便获得构成它的2个“单词”。
要进行第一次拆分,可以尝试以下公式:
\w+\W+\w+\K\W+
然后,对于每个令牌,您必须使用以下命令再次将其令牌化:
\W+
要获得3个“单词”的记号,可以将以下模式用于初始拆分:
\w+\W+\w+\W+\w+\K\W+
此方法利用\ K功能从匹配中删除从正则表达式捕获到该点的所有内容,然后开始将返回的新匹配。所以从本质上讲,我们做到了:匹配一个单词,匹配分隔符,匹配另一个单词,忘记所有内容,匹配分隔符并仅返回那些。
在RapidMiner中,可以使用2个连续的正则表达式令牌生成器来实现,第一个使用上述公式,第二个使用仅在每个令牌(\ W +)中使用的分隔符。
还请注意,模式\ w仅选择拉丁字符,因此,如果您的文档包含不同字符集的文本,这些字符将被\ W占用,该\ W应该与分隔符匹配。如果要捕获非拉丁字符集的文本(例如希腊),则需要更改公式,如下所示:
\p{L}+\P{L}+\p{L}+\K\P{L}+
此外,如果希望公式以一种语言而不是另一种语言捕获文本,则可以通过指定{ Language_Identifier }代替{L}来进行相应的修改。例如,如果您只想捕获希腊文本,则将使用RapidMiner supports的“ {Greek}”或“ {InGreek}”。
答案 1 :(得分:0)
您可以做的是使用零宽度的组(例如正向向前看,如示例所示)。正则表达式通常“消耗”它检查的字符,但是在正向查找/向后查找时,您断言字符存在,而不会阻止进一步的检查来检查那些字母。
这应该适合您的目的:
(\w+)(?=(\W+\w+))
以下模式对于两个单词的每对都匹配(请注意,由于它没有一对,因此不会匹配最后一个单词)。第一个单词在第一个捕获组(\w+)
中。然后,正向前瞻包括一系列非单词字符\W+
的匹配项,然后是另一个单词字符\w+
的字符串匹配项。前瞻(?=...)
第二个单词未“消耗”。
Here is a link to a demo on Regex101
请注意,对于每个匹配项,每个单词都位于其自己的捕获组(第1组,第2组)中
答案 2 :(得分:0)