我想在两个其他字符串之间提取一个字符串。一个字符串是回车符,而另一个字符串是几乎相似字符的变体:
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 /二千零十二分之二千二百十九“ 。
还有另一种方法可以达到这个目的吗?
答案 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")