我正在尝试提取在文本聊天中标记的用户名,例如“@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
。
你可以让你的正则表达式不贪婪:
或者如果你想在@
标志之后只捕获“This”,你可以像这样只使用正面的lookbehind:
说明
(?<=
@
)
\w+
正则表达式的中心部分((.*)
)是任何字符的序列。
相反,你应该寻找除了空格(\S+
)或单词字符(\w+
)之外的一系列字符。
另请注意,我将*
更改为+
,因为您可能对任何空的字符序列都不感兴趣。
要捕获源字符串中具有“最后”位置的名称,正则表达式的最后部分不仅应匹配空格字符序列,还应匹配字符串的结尾,因此将(?=\\s+)
更改为(?=\\s+|$)
。
最后一句话:实际上你不需要围绕“中心”部分的括号。
总而言之,整个正则表达式可以是这样的:
(?<=@)\w+(?=\s+|$)
(有全局选项)。
这是一种非正则表达式方法,或者说是一种最小正则表达式方法,因为grep
通过正则表达式引擎检测@
grep('@', strsplit(x, ' ')[[1]], value = TRUE)
#[1] "@This"
或者为了避免使用strsplit
,我们可以使用scan
(取自this answer),即
grep('@', scan(textConnection(x), " "), value=TRUE)
#Read 7 items
#[1] "@This"