Reg表达西里尔字母的问题

时间:2017-05-31 14:16:14

标签: r regex stringr

过去我的正则表达和西里尔字母有问题,所以我想知道是否有什么我做错了吗?

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

示例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

示例2 - grep的ignore.case = TRUE问题:

randomWord <- "Човек"

grep(pattern = "човек", x = randomWord, ignore.case = T)
#returns: integer(0)

关于如何编写正则表达式以使它们在西里尔字母中工作的任何想法?

我的默认文本编码是UTF-8,这是我的sessionInfo:

> sessionInfo()
R version 3.3.3 (2017-03-06)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)

locale:
[1] LC_COLLATE=Bulgarian_Bulgaria.1251  LC_CTYPE=Bulgarian_Bulgaria.1251   
[3] LC_MONETARY=Bulgarian_Bulgaria.1251 LC_NUMERIC=C                       
[5] LC_TIME=Bulgarian_Bulgaria.1251 

2 个答案:

答案 0 :(得分:1)

我不确定为什么<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class="container"> <h1>Responsive Popup</h1> <a class="popup-trigger" data-target="#popup1">Open PopUp 1</a> <a class="popup-trigger" data-target="#popup2">Open PopUp 2</a> </div> <div id="popup1" class="popup"> <div class="popup-text">This is my popup 1</div> <span class="popup-btn-close">&times;</span> </div> <div id="popup2" class="popup"> <div class="popup-text">This is my popup 2</div> <span class="popup-btn-close">&times;</span> </div>在这种情况下会返回str_extract,因为正则表达式似乎有效。

NAstr_locate似乎按预期工作:

str_detect

针对您的问题的解决方法是将stringr::str_detect(cyrilic, "(?<=град Ню Йорк, )[\\w\\s]+(?=\n)") #returns TRUE stringr::str_locate(cyrilic, "(?<=град Ню Йорк, )[\\w\\s]+(?=\n)") #returns the start and end positions for Манхатън substr()结合使用:

str_locate

答案 1 :(得分:1)

问题可能在于ICU如何处理从字符串str_extract收到的模式:似乎所产生的lookbehind模式停止具有已知宽度。或者,str_extract还存在其他一些错误。

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

> str_match(cyrilic, pattern = "град Ню Йорк,\\s*([\\w\\s]+)\n")[,2]
[1] "Манхатън"

只需访问正确的组,此处,它是结果列表中的第二项。

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

> randomWord <- "Човек"
> grep(pattern = "човек", x = randomWord, ignore.case = T, perl=TRUE)
[1] 1

同样有效。