在R

时间:2018-01-09 16:42:04

标签: r regex stringr

我想在两个其他字符串之间提取一个字符串。一个字符串是回车符,而另一个字符串是几乎相似字符的变体:

dput(head(decisions$Title))
c("Zinaida Shumilina et al. v. Belarus                    \r\n                    
CCPR/C/120/D/2142/2012", 
"K.E.R. vs. Canada                    \r\n                    
CCPR/C/120/D/2196/2012", 
"Lounis Khelifati v Algeria                    \r\n                    
CCPR/C/120/D/2267/2013", 
"Hibaq Said Hash v. Denmark                    \r\n                    
CCPR/C/120/D/2470/2014", 
"Anton Batanov v. Russian Federation                    \r\n                    
CCPR/C/120/D/2532/2015", 
"S. Z. v. Denmark                    \r\n                    
CCPR/C/120/D/2625/2015"
)

我基本上想要在“v”之间提取国家/地区名称。和回车\ r。但是,“v。”有时是“v”,“vs.”,“vs”和“v:”。

根据相关SO问题的答案,我尝试了以下内容:

res <- str_match(decisions$Title, "(v\\.|vs\\.|v)(.*?)\\r")
res[,3]

不幸的是,这并没有得到所有变化,或者在某些情况下它会在尝试从“Navruz Tahirovich Nasyrlayev诉土库曼斯坦CCPR / C / 117”中提取国家名称时返回“ruz Tahirovich Nasyrlayev诉土库曼斯坦”等数据/ d /二千零十二分之二千二百十九“ 。

还有另一种方法可以达到这个目的吗?

3 个答案:

答案 0 :(得分:6)

您可以使用

trimws(str_match(decisions$Title, "\\bv(?:s?\\.|:)?\\s*(.*)")[,2])

请参阅regex demo。请注意,trimws将删除多余的前导和尾随空格字符。

模式详情

  • \b - 字边界
  • v - v字符
  • (?:s?\\.|:)? - 可选择匹配可选的s,后跟.:字符
  • \\s* - 0+空白字符
  • (.*) - 第1组:除了换行符之外的任何0 +字符(请注意,您不必担心.是否与CR符号匹配(在使用的TRE正则表达式中) sub .也匹配LF符号)因为trimws无论如何都会削减前导/尾随空格。)

在R中测试:

> df<-c("Zinaida Shumilina et al. v. Belarus                    \r\n                    
+ CCPR/C/120/D/2142/2012", 
+ "K.E.R. vs. Canada                    \r\n                    
+ CCPR/C/120/D/2196/2012", 
+ "Lounis Khelifati v Algeria                    \r\n                    
+ CCPR/C/120/D/2267/2013", 
+ "Hibaq Said Hash v. Denmark                    \r\n                    
+ CCPR/C/120/D/2470/2014", 
+ "Anton Batanov v. Russian Federation                    \r\n                    
+ CCPR/C/120/D/2532/2015", 
+ "S. Z. v. Denmark                    \r\n                    
+ CCPR/C/120/D/2625/2015"
+ )

> trimws(str_match(df, "\\bv(?:s?\\.|:)?\\s*(.*)")[,2])
[1] "Belarus"            "Canada"             "Algeria"           
[4] "Denmark"            "Russian Federation" "Denmark"           
> 

答案 1 :(得分:4)

我们可以使用sub来匹配字符(.*),直到字词边界(\\b)后跟&#39; v&#39;然后是s或。,一个或多个空格(\\s+)并捕获不是\r[^\r]+)的字符以及其后的其他字符。在替换中,使用捕获的组的反向引用(\\2)并使用trimws

删除尾随空格
trimws(sub(".*\\bv(s*\\.*)\\s+([^\r]+)\\s*\r.*", "\\2", v1))
#[1] "Belarus"            "Canada"             "Algeria"   
#[4] "Denmark"            "Russian Federation" "Denmark"           

答案 2 :(得分:0)

您还可以在&#34; v&#34;

之前添加单词边界
str_match(decisions$Title, "(\\b)(v\\.|vs\\.|v)(.*?)\\r")