我正在尝试为一组约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上使用。
答案 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