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

Regex 有没有办法在正则表达式中使用周期性?,regex,delimiter,rapidminer,Regex,Delimiter,Rapidminer,我正在尝试为Rapidminer中的标记器运算符查找正则表达式 现在,我要做的是将文本分成两个单词的一部分。 例如,那是一部好电影。应该导致那是一部,是一部,好电影 标记器中正则表达式的特殊之处在于它起到了分隔符的作用,因此匹配的是分割点,而不是要保留的 因此,第一个想法是使用\s在空白处进行分割,但这将导致每个单词分别获得 所以,我的问题是如何强制表达式以某种方式跳过两个空格中的一个?可以使用零宽度组(如示例中所示的正向前瞻)。正则表达式通常“使用”它所检查的字符,但如果具有正向的前向/后向,

我正在尝试为Rapidminer中的
标记器
运算符查找正则表达式

现在,我要做的是将文本分成两个单词的一部分。
例如,
那是一部好电影。
应该导致
那是一部
是一部
好电影

标记器中正则表达式的特殊之处在于它起到了分隔符的作用,因此匹配的是分割点,而不是要保留的

因此,第一个想法是使用
\s
在空白处进行分割,但这将导致每个单词分别获得


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

可以使用零宽度组(如示例中所示的正向前瞻)。正则表达式通常“使用”它所检查的字符,但如果具有正向的前向/后向,则可以断言字符存在,而不会阻止进一步检查这些字母

这应该适用于您的目的:

(\w+)(=(\w+\w+)
以下模式匹配每对两个单词(请注意,它不会匹配最后一个单词,因为它没有一对)。第一个单词在第一个捕获组中,
(\w+)
。然后,正向前瞻包括一个非单词字符序列的匹配
\W+
,然后是另一个单词字符字符串
\W+
。前瞻
(?=…)
第二个单词不是“已消费”

请注意,对于每个匹配,每个单词都在其自己的捕获组中(组1,组2)

是一个示例解决方案,
(?=(\b[A-Za-z]+\s[A-Za-z]+)
受此启发。

一旦您理解了这是一个重叠正则表达式模式的问题,我的问题听起来就错了。

首先,我们可以使用\W来识别分隔单词的字符。要删除多个连续实例,我们将使用:

\W+
考虑到这一点,您希望拆分“\W+”表达式中包含的每2个字符实例。因此,结果必须是具有以下形式的字符串:

<a "word"> <separators that are matched by the pattern "\W+"> <another "word">
然后,对于每个令牌,您必须使用以下方法再次对其进行令牌化:

\W+
要获取3个“单词”的标记,可以使用以下模式进行初始拆分:

\w+\W+\w+\W+\w+\K\W+
这种方法利用了\K功能,该功能从匹配中删除到该点为止从正则表达式捕获的所有内容,并启动将返回的新匹配。所以本质上,我们是这样做的:匹配一个单词,匹配分隔符,匹配另一个单词,忘记一切,匹配分隔符,只返回那些

在RapidMiner中,这可以通过两个连续的正则表达式令牌化器来实现,第一个使用上述公式,第二个仅在每个令牌(\W+)中使用分隔符

还请注意,模式\w仅选择拉丁字符,因此如果文档包含不同字符集中的文本,则这些字符将被\w使用,而该字符应与分隔符匹配。如果要使用非拉丁字符集(例如希腊语)捕获文本,则需要如下更改公式:

\p{L}+\P{L}+\p{L}+\K\P{L}+

此外,如果希望公式捕获一种语言上的文本而不是另一种语言上的文本,可以通过指定{language_Identifier}代替{L}对其进行相应的修改。例如,如果您只想捕获希腊文文本,您将使用“{Greek}”或“{InGreek}”,这是RapidMiner的功能。

这与我描述的不一样。我发现这个问题的解决方案与n-gram有关,看看这个
\p{L}+\P{L}+\p{L}+\K\P{L}+