我正在尝试提取在文字聊天中标记的用户名,例如“@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
。
答案 0 :(得分:3)
你可以让你的正则表达式不贪婪:
或者,如果您想在@
符号之后仅捕获“此”,您可以像这样只使用正面的背后搜索:
<强>解释强>
(?<=
@
)
\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"