【问题标题】:Using stringr to extract one or multiple words from text string in R使用 stringr 从 R 中的文本字符串中提取一个或多个单词
【发布时间】:2016-01-17 22:52:14
【问题描述】:

我有以下数据框:

df <- data.frame(city=c("in London", "in Manchester city", "in Sao Paolo"))

我正在使用 str_extract 并在单独的列中返回“in”之后的单词。

library(stringr)
str_extract(df$city, '(?<=in\\s)\\w+')

这在 95% 的情况下都适用于我。但是,在上面的“Sao Paolo”之类的情况下,我的正则表达式会返回“Sao”而不是城市名称。

有人可以帮我修改它以捕获:

1) 我要从中提取的文本字符串末尾的所有内容?或

2) 如果'in'后面有多个单词,那么也返回它

非常感谢。

【问题讨论】:

  • 你只想要(?&lt;=in\\s).+吗?还是(?&lt;=in\\s)\\w+(?:\\s+\\p{Lu}\\p{L}*)??看起来您使用(?&lt;=in\\s)\\p{Lu}\\p{L}*(?:\\s+\\p{Lu}\\p{L}*)* 会更安全。
  • 为什么不只是gsub('^in ', '', df$city)
  • 对于它的价值,您的正则表达式没有在“Sao Paolo”中选择“Paolo”的原因是因为空格不算作单词字符,所以\\w+ 在它得到时停止到空间。调整它时要小心,因为如果你只是允许空格,你最终会捕获“曼彻斯特城”,而不仅仅是“曼彻斯特”。
  • 我还推荐使用str_match,因为in 和城市之间可能有两个空格。例如。 cities = str_match(df$city, '\\bin\\s+(\\p{Lu}\\p{L}*(?:\\s+\\p{Lu}\\p{L}*)*)') 然后cities[,2] 将保存这些值。
  • @WiktorStribiżew 您最简单的正则表达式 '(?

标签: regex r stringr


【解决方案1】:

这个班轮可以为你做吗?

unlist(lapply(strsplit(c("in London", "in Sao Paulo", "in Manchester City"), "in "), function(x) x[2]))
[1] "London"          "Sao Paulo"       "Manchester City"

【讨论】:

    【解决方案2】:

    要匹配第一个 in 后跟空格的字符串的所有其余部分,您可以使用

    (?<=in\\s).+
    

    lookbehind 匹配带有空格的in 介词,但不会在匹配中返回它,因为lookbehind 是零宽度断言

    【讨论】:

      【解决方案3】:

      你可以试试这个:

      library(stringr)
      df$onlyCity <- str_extract(df$city, '[^in ](.)*')
      df
                      city        onlyCity
      1          in London          London
      2 in Manchester city Manchester city
      3       in Sao Paolo       Sao Paolo
      

      【讨论】:

        【解决方案4】:
        gsub("^in[ ]*(.*$)", "\\1", df$city)
        [1] "London"          "Manchester city" "Sao Paolo" 
        

        假设您的字符串以"in" 开头,后跟一些空格(不会超过一个),然后是从第一个非空白字符到结尾捕获的感兴趣的文本字符串。

        【讨论】:

          猜你喜欢
          • 2018-10-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-25
          • 1970-01-01
          • 2016-09-10
          • 2015-05-08
          相关资源
          最近更新 更多