R中包含非ascii字符的正面后视

时间:2016-03-15 19:59:34

标签: regex r arabic stringr

我正在尝试为一组约2,100个文本中的每个文本提取第一组非空白字符,这些字符遵循阿拉伯字符串。其中一些文本包含字符串,而其他文本则不包含字符串。如果字符串是英文的,那么使用str_extract包中的stringr这将是一项非常简单的任务。但是,出于某些原因,在后视模式中使用阿拉伯字符串时,此功能不起作用:

library(stringr)
test_texts <- c(
    "My text كلمة containing some Arabic",
    "My text كلمة again containing some Arabic",
    "My text that doesn't contain any Arabic"
)
str_extract(test_texts, "(?<=text )\\S+")
# [1] "كلمة" "كلمة" "that"
str_extract(test_texts, "(?<=containing )\\S+")
# [1] "some" "some" NA    
str_extract(test_texts, "(?<=كلمة )\\S+") #returns NAs even though string is there
# [1] NA NA NA

请注意,如果我不使用后视模式,则此方法有效:

str_extract(test_texts, "كلمة \\S+")
# [1] "كلمة containing" "كلمة again"      NA               

为什么只有在使用后视模式时阿拉伯语才会搞砸?

我在OS X 10.11.3上使用R版本3.2.3,在字符串版本1.0.0上使用。

2 个答案:

答案 0 :(得分:2)

似乎存在一些问题str_extract如何处理正面观察中的从右到左的文本。作为一种变通方法,您可以使用str_match与子模式周围具有捕获组的正则表达式捕获您需要的值:

> res <- str_match(test_texts, "كلمة +(\\S+)")
> res[,2]
[1] "containing" "again"      NA          

即使在阿拉伯语单词后面有超过1个空格,此解决方案也允许匹配非空格块。

答案 1 :(得分:0)

你可以像这样grep非ascii字符:

str_extract(test_texts, "[^\001-\177]+")
[1] "كلمة" "كلمة" NA   

str_extract(test_texts, "(?<=[^\001-\177] )\\S+")
[1] "containing" "again"      NA       

这似乎有用......只需添加括号即可。这可能还不够,因为如果字符在括号中,则字符可以是任何顺序。

str_extract(test_texts, "(?<=[كلمة] )\\S+")
[1] "containing" "again"      NA