【发布时间】:2017-12-22 16:05:04
【问题描述】:
R 包“countrycode”包含一个数据框 (countrycode_data),其中还包含一个名为“country.name.en.regex”的变量。此变量包含我想使用的正则表达式模式,以便创建一个新列,该列是 TRUE 或 FALSE,具体取决于国家名称或其变体是否出现在某些列中,请参见下面的示例。
AB <- c('CHINAS PARTY CONGRESS','JAPAN-US RELATIONS','JAPAN TRIES TO')
TI <- c('AMERICAN FOREIGN POLICY', 'CHINESE ATTEMPTS TO', 'BRITAIN HAS TEA')
AU <- c('AUTHOR 1', 'AUTHOR 2','AUTHOR 3')
M <- data.frame(AB,TI,AU)
M$Japan<- !!rowSums(sapply(M[c(1:3)], grepl, pattern ='JAPAN'))
日本的正则表达式当然很简单,但也有更复杂的情况。例如,
> M$Czech_Republic<- !!rowSums(sapply(M[c(3, 7:9)], grepl, pattern ="^(?=.*REP).*CZECH|CZECHIA|BOHEMIA"))
在这种情况下,我确实收到以下错误:
Error in FUN(X[[i]], ...) :
invalid regular expression '^(?=.*REP).*CZECH|CZECHIA|BOHEMIA', reason 'Invalid regexp'
>
我现在已经测试了所有提供的正则表达式,并意识到那些不起作用的往往包含
^(?=.* 或 ^(?!.*
我还注意到,例如单词边界没有用两个反斜杠转义(即原始中的 \B 而不是 \B)。有没有我不知道的简单解决方案?还是另一种替代方法?以下是一些返回错误的正则表达式的完整示例:
M$China<- !!rowSums(sapply(M[c(3, 7:9)], grepl, pattern ="^(?!.*\\BMAC)(?!.*\\BHONG)(?!.*\\BTAI)(?!.*\\BREP).*CHINA|^(?=.*PEO)(?=.*REP).*CHINA"))
M$United_States_of_America<- !!rowSums(sapply(M[c(3, 7:9)], grepl, pattern ="UNITED.?STATES\\B(?!.*ISLANDS)|\\BU\.?S\.?A\.?\\B|^\S*U\.?S\.?\\B(?!.*ISLANDS)"))
M$Republic_of_Korea<- !!rowSums(sapply(M[c(3, 7:9)], grepl, pattern ="^(?!.*D.*P.*R)(?!.*DEMOCRAT)(?!.*PEOPLE)(?!.*NORTH).*\\BKOREA(?!.*D.*P.*R)"))
谢谢! SCW
【问题讨论】:
-
要使前瞻模式起作用,请添加
perl=TRUE。此外,您想要的捷克正则表达式应类似于"^(?=.*REP).*(?:CZECH(?:IA)?|BOHEMIA)" -
谢谢,维克托。我没有想到 Perl,但它似乎成功了。为什么必须更改捷克正则表达式?
-
只是习惯的力量。我认为
^(?=.*REP).*指的是CZECH|CZECHIA|BOHEMIA中的所有替代品