在R中,我需要从以下字符串中提取“八”:
this_str <- " Eight years blah blah 50 blah blah, two years blah blah blah."
这是我尝试使用gsub的尝试:
gsub("^.*\\s([^ ]*)\\s(years|months)\\s.*", "\\1", this_str)
但是这将返回“ two”,这对应于gsub()中指示的模式的第二次出现。在其他文章中,据说sub()应该返回第一个匹配项。但是当我使用sub()时,它也会给出“两个”。
答案 0 :(得分:3)
sub
执行一次替换,而gsub
执行多次替换。相反,问题在于开头的.*
是 greedy :上升到“两个”(即,包括最后一个匹配项在内的所有匹配项)。相反,我们希望懒惰(请参见here)并尽可能少地匹配:
sub("^.*?\\s([^ ]*)\\s(years|months)\\s.*", "\\1", this_str)
# [1] "Eight"
答案 1 :(得分:2)
在这里,我们可能会使用一个传递可选空格的表达式,以防万一,例如:
(\s+)?(.+?)(\s+)?(years?|months?).*
我们所需的输出在第二个捕获组中:
(.+?)
我们的代码看起来像
gsub("(\\s+)?(.+?)(\\s+)?(years?|months?).*", "\\2", this_str)
如果不需要此表达式,并且希望对其进行修改,请访问regex101.com上的此链接。
jex.im可视化正则表达式: