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

问题描述 投票:0回答:3

我正在尝试提取在文本聊天中标记的用户名,例如“@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

r regex stringr
3个回答
3
投票

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

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

或者如果你想在@标志之后只捕获“This”,你可以像这样只使用正面的lookbehind:

(?<=@)\w+

说明

  • 积极的背后(?<=
  • 这说明背后的是@
  • 关闭正面lookbehind )
  • 匹配一个或多个单词字符\w+

3
投票

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

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

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

要捕获源字符串中具有“最后”位置的名称,正则表达式的最后部分不仅应匹配空格字符序列,还应匹配字符串的结尾,因此将(?=\\s+)更改为(?=\\s+|$)

最后一句话:实际上你不需要围绕“中心”部分的括号。

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

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

(有全局选项)。


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"
© www.soinside.com 2019 - 2024. All rights reserved.