R 编程:使用正则表达式提取字符串(不包括空格)

R 编程:使用正则表达式提取字符串(不包括空格),r,regex,R,Regex,所以我在这里要做的是提取“Charlie”之前的单词(不包括空格) a = 'Charlie is at the pet shop.' b = ' Charlie is at the pet shop.' c = 'Jane saw Charlie at the pet shop.' 到目前为止我所做的尝试: > gsub('(.*?)((\\s)*Charlie).*','\\1',a) [1] "" > gsub('(.*?)((\\s)*Charlie).*','\\1'

所以我在这里要做的是提取“Charlie”之前的单词(不包括空格)

a = 'Charlie is at the pet shop.'
b = '   Charlie is at the pet shop.'
c = 'Jane saw Charlie at the pet shop.'
到目前为止我所做的尝试:

> gsub('(.*?)((\\s)*Charlie).*','\\1',a)
[1] ""
> gsub('(.*?)((\\s)*Charlie).*','\\1',b)
[1] "   "
> gsub('(.*?)((\\s)*Charlie).*','\\1',c)
[1] "Jane saw "
我想要达到的目标:

[1] ""
[1] ""
[1] "Jane saw "

我可以知道为什么上面的代码不起作用吗?另外,我应该如何修改regex模式,以便实现我想要的功能?

使用
sub
看起来并不漂亮,但可以这样做:

> sub(".*?(\\S+(?:\\s+\\S+)*)\\s+Charlie.*|.+", "\\1", x)
[1] ""         ""         "Jane saw"
详细信息

  • *?
    -任何字符,尽可能少
  • (\\S+(?:\\S+\\S+)
    -第1组(
    \\1
    ):
    • \\S+
      -1个或多个非空白字符
    • (?:\\s+\\s+)*
      -零个或多个1+空格序列,后跟1+非空格字符
  • \\s+
    -1+空格
  • Charlie
    -子字符串
  • *
    -到字符串结尾的任何0+字符
  • |
    -或
  • +
    -任意1+字符(将字符串归零)
使用stringr
str_extract
,它看起来会更好:

> library(stringr)
> res <- str_extract(x, "\\S+(?:\\s+\\S+)*(?=\\s+Charlie\\b)")
> res
[1] NA         NA         "Jane saw"
这里,

  • \\s*
    -查找第一组0+空格字符,后跟
  • Charlie
    -子字符串
    Charlie
    后跟
  • *
    -字符串末尾的任何0+字符

    • 使用
      sub
      看起来并不漂亮,但可以这样做:

      > sub(".*?(\\S+(?:\\s+\\S+)*)\\s+Charlie.*|.+", "\\1", x)
      [1] ""         ""         "Jane saw"
      
      详细信息

      • *?
        -任何字符,尽可能少
      • (\\S+(?:\\S+\\S+)
        -第1组(
        \\1
        ):
        • \\S+
          -1个或多个非空白字符
        • (?:\\s+\\s+)*
          -零个或多个1+空格序列,后跟1+非空格字符
      • \\s+
        -1+空格
      • Charlie
        -子字符串
      • *
        -到字符串结尾的任何0+字符
      • |
        -或
      • +
        -任意1+字符(将字符串归零)
      使用stringr
      str_extract
      ,它看起来会更好:

      > library(stringr)
      > res <- str_extract(x, "\\S+(?:\\s+\\S+)*(?=\\s+Charlie\\b)")
      > res
      [1] NA         NA         "Jane saw"
      
      这里,

      • \\s*
        -查找第一组0+空格字符,后跟
      • Charlie
        -子字符串
        Charlie
        后跟
      • *
        -字符串末尾的任何0+字符
        • 为什么不简单

          sub('Charlie.*', '', x)
           #[1] ""          "   "       "Jane saw "
          

          为什么不干脆

          sub('Charlie.*', '', x)
           #[1] ""          "   "       "Jane saw "
          


          谢谢你的详细解释!!它确实帮助我理解了你的代码!:)一如既往的好选择!仅供参考:根据问题判断,在第二种解决方案中不需要输入单词边界,但当问题提到单词时,我通常会自动插入它。如果您需要在文本包含
          字符时进行匹配,请删除该
          \b
          。感谢您的详细解释!!它确实帮助我理解了你的代码!:)一如既往的好选择!仅供参考:根据问题判断,在第二种解决方案中不需要输入单词边界,但当问题提到单词时,我通常会自动插入它。如果您需要在文本包含
          Charlies
          时进行匹配,请删除该
          \b
          。不知道R上有trimws()函数!非常感谢您的帮助!:)是的,如果要删除从字符串末尾的第一个
          Charlie
          开始的所有文本,这将起作用。但是我会使用
          sub
          而不是
          gsub
          ,因为预期只有一个替换。不知道R上有一个trimws()函数!非常感谢您的帮助!:)是的,如果要删除从字符串末尾的第一个
          Charlie
          开始的所有文本,这将起作用。但是我会使用
          sub
          而不是
          gsub
          ,因为预期只有1个替换。