Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reg表达式与西里尔字母有关_R_Regex_Stringr - Fatal编程技术网

Reg表达式与西里尔字母有关

Reg表达式与西里尔字母有关,r,regex,stringr,R,Regex,Stringr,过去我在正则表达式和西里尔字母方面遇到过问题,所以我想知道我是否做错了什么 以下是两个可重复的示例: 示例1-前向和后向断言的问题: latin <- "city New York, Manhattan\n1st Avenue" cyrilic <- "град Ню Йорк, Манхатън\n1во Авеню" stringr::str_extract(latin, pattern = "(?<=city New York, )[\\w\\s]+(?=\n)") #

过去我在正则表达式和西里尔字母方面遇到过问题,所以我想知道我是否做错了什么

以下是两个可重复的示例:

示例1-前向和后向断言的问题:

latin <- "city New York, Manhattan\n1st Avenue"
cyrilic <- "град Ню Йорк, Манхатън\n1во Авеню"

stringr::str_extract(latin, pattern = "(?<=city New York, )[\\w\\s]+(?=\n)")
#returns: Manhattan

stringr::str_extract(cyrilic, pattern = "(?<=град Ню Йорк, )[\\w\\s]+(?=\n)")
stringr::str_extract(cyrilic, pattern = "(?<=град Ню Йорк, ).+(?=\n)")
#both return: NA

我不知道为什么在这种情况下
str_extract
返回
NA
,因为正则表达式似乎是有效的

然而,
str\u locate
str\u detect
似乎按预期工作:

stringr::str_detect(cyrilic, "(?<=град Ню Йорк, )[\\w\\s]+(?=\n)")
#returns TRUE
stringr::str_locate(cyrilic, "(?<=град Ню Йорк, )[\\w\\s]+(?=\n)")
#returns the start and end positions for Манхатън

问题可能在于ICU如何处理从stringr
str_extract
接收到的模式:似乎生成的lookback模式不再具有已知的宽度。或者,
str\u extract
还有其他一些bug

在这种情况下,使用模式长度没有问题的
str_match
更安全:

> str_match(cyrilic, pattern = "град Ню Йорк,\\s*([\\w\\s]+)\n")[,2]
[1] "Манхатън"
只需访问正确的组,在这里,它是结果列表中的第二项

至于您与
grep
一起使用的TRE regex,我还观察了不同环境中的各种问题。在我的Windows 7计算机上,您的代码返回
1
。但是,使用文本Unicode字母的TRE正则表达式可能会失败,最佳实践是使用PCRE正则表达式。要使其完全支持Unicode,请不要忘记在模式开始处添加
(*UCP)
PCRE动词,以便
\w
\d
等可以匹配所有Unicode字符。在这里,这是没有必要的

> randomWord <- "Човек"
> grep(pattern = "човек", x = randomWord, ignore.case = T, perl=TRUE)
[1] 1
随机词grep(pattern=“ччччччч”,x=randomWord,ignore.case=T,perl=TRUE) [1] 1
同样可以正常工作。

确保将脚本保存为UTF8。默认情况下,R Studio不会将文件保存为UTF8。谢谢,很高兴知道这一点。但是,我在交互使用R时也遇到了这些问题。启用
perl=TRUE
可以使第二个工作。@alistaire是的,它确实工作!谢谢然而,你必须添加这一部分仍然很奇怪,不是吗?是的,除了特定的正则表达式引擎之外,这里还有更大的问题。
substr(cyrilic, 
   stringr::str_locate(cyrilic, "(?<=град Ню Йорк, )[\\w\\s]+(?=\n)")[1], 
   stringr::str_locate(cyrilic, "(?<=град Ню Йорк, )[\\w\\s]+(?=\n)")[2]
)
#returns 'Манхатън'
> str_match(cyrilic, pattern = "град Ню Йорк,\\s*([\\w\\s]+)\n")[,2]
[1] "Манхатън"
> randomWord <- "Човек"
> grep(pattern = "човек", x = randomWord, ignore.case = T, perl=TRUE)
[1] 1