在R语言中,重音符号和正则表达式

3

在R中,我有一列应该只包含一个单词。它是通过获取另一列的内容,并使用正则表达式仅保留最后一个单词来创建的。然而,对于某些行,这种方法不起作用,此时R只是复制了第一列的内容。以下是我的R代码:

df$precedingWord <- gsub(".*?\\W*(\\w+-?)\\W*$","\\1", df$leftContext, perl=TRUE)
precedingWord 应该只包含一个单词。它是通过正则表达式从 leftContext 中提取的。总体上,这个方法很有效,但是对于带有变音符号的字母却不行。在 leftContext 中,有几行带有变音符号,比如 é 和 à。由于某种原因,R 完全忽略了这些内容,并将整个 leftContext 复制到 precedingWord 中。我觉得这很奇怪,因为正则表达式不可能匹配整个 leftContext,正如你在这里看到的。在这个例子中,Test string 是 leftContext,Substitution 应该是 *precedingWord。
正如你在上面的例子中看到的,在线正则表达式测试器的输出与我得到的输出不同。我只是得到了 leftContext 的精确副本。这并不意味着在线测试器的输出就是我想要的。现在,该工具将带有变音符号的字母视为非单词字符,因此它不会将其标记为我想要的输出。但实际上,我希望将它们视为单词字符,以便它们可以成为输出的候选项。
如果这是输入:
Un premier projet prévoit que l'établissement verserait 11 FF par an et par élève du secondaire et 30 FF par étudiant universitaire, une somme à évaluer et à  
Outre le prêt-à- 
And à 
Sur base de ces données, on cherchera à 
Ce sera encore le cas ce vendredi 19 juillet dans l'é

我期望看到的输出是这样的。
à
prêt-à-
à
à
é

这是我已经有的正则表达式

.*?\W*(\w+?-?)\W*$

我已经在我的项目中使用了stringi,如果它提供了解决方案,我可以使用它。


2
使用\p{L} - df$precedingWord <- gsub(".*?\\P{L}*(\\p{L}+-?)\\P{L}*$","\\1", df$leftContext, perl=TRUE) - Wiktor Stribiżew
@AvinashRaj 请看我的修改。 - Bram Vanroy
1
df$precedingWord <- gsub(".*?\\b([\\w-]+) *$", "\\1", df$leftContext, perl=TRUE) 怎么样? - Jota
@stribizhev,您能将其发布为答案吗?我很乐意接受。 - Bram Vanroy
1个回答

1
在类似Perl的正则表达式中,您可以使用\p{L}简写类来匹配任何Unicode字母,并且所有非Unicode字符都可以使用反向类\P{L}进行匹配。请参见regular-expressions.info

您可以使用\p{L}匹配属于“字母”类别的单个字符。您可以使用\P{L}匹配不属于该类别的单个字符。

因此,您可以使用以下正则表达式:
df$precedingWord <- gsub(".*?\\P{L}*(\\p{L}+-?)\\P{L}*$","\\1", df$leftContext, perl=TRUE)

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