有没有办法在正则表达式中使用周期性?

时间:2019-11-02 21:12:54

标签: regex delimiter rapidminer

我正在尝试为Rapidminer中的Tokenizer运算符查找正则表达式。

现在,我要做的是将文本分成两个词的一部分。
例如,That was a good movie.的结果应为That waswas aa goodgood movie

在分词器中正则表达式的特殊之处在于它扮演定界符的角色,因此您匹配分割点而不是要保留的内容。

因此,首先想到的是使用\s以便在空白处进行拆分,但这将导致分别获取每个单词。

所以,我的问题是如何强制表达式以某种方式跳过两个空白之一?

3 个答案:

答案 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)

Here是示例解决方案,(?=(\b[A-Za-z]+\s[A-Za-z]+))受此question启发。
一旦您了解到这是一个正则表达式模式重叠的问题,我的问题听起来就错了。