如何在符号和空格之间提取字符串?

时间:2017-12-27 13:25:46

标签: r regex stringr

我正在尝试提取在文字聊天中标记的用户名,例如“@Jack @Marie Hi there!”

我试图在@和空白的组合上做到这一点,但我不能让正则表达式匹配非贪婪(或者至少这是我认为是错误的):

library(stringr)
str_extract(string = '@This is what I want to extract', pattern = "(?<=@)(.*)(?=\\s+)")

[1] "This is what I want to"

我想要提取的只是This

3 个答案:

答案 0 :(得分:3)

你可以让你的正则表达式不贪婪:

(?<=@)(.*?)(?=\s+)

或者,如果您想在@符号之后仅捕获“此”,您可以像这样只使用正面的背后搜索:

(?<=@)\w+

<强>解释

  • 积极的后视(?<=
  • 断言背后的是@
  • 关闭正向值)
  • 匹配一个或多个单词字符\w+

答案 1 :(得分:3)

正则表达式的中心部分((.*))是任何字符的序列。

相反,你应该寻找除了空白之外的一系列字符 (\S+)或字词\w+)。

另请注意,我将*更改为+,因为您可能不感兴趣 在任何空的字符序列中。

还要捕获源中具有“最后”位置的名称 字符串,你的正则表达式的最后一部分不仅应该匹配序列 的空格字符,也是字符串的结尾,所以改变 (?=\\s+)(?=\\s+|$)

最后一句话:其实你不需要括号 “中心”部分。

总而言之,整个正则表达式可以是这样的:

(?<=@)\w+(?=\s+|$)

(使用全球 oprion)。

答案 2 :(得分:2)

这是一种非正则表达式方法,或者说是一种最小正则表达式方法,因为grep通过正则表达式引擎检测@

grep('@', strsplit(x, ' ')[[1]], value = TRUE)
#[1] "@This"

或者为了避免strsplit,我们可以使用scan(取自this answer),即

grep('@', scan(textConnection(x), " "), value=TRUE)
#Read 7 items
#[1] "@This"