如何提取符号和space之间的字符串?
How to extract a string between a symbol and a space?
我正在尝试提取文本聊天中标记的用户名,例如“@Jack @Marie 你好!”
我正在尝试结合 @ 和空格来执行此操作,但我无法让正则表达式匹配非贪婪(或者至少我认为这是错误的):
library(stringr)
str_extract(string = '@This is what I want to extract', pattern = "(?<=@)(.*)(?=\s+)")
[1] "This is what I want to"
我想提取的只是 This
。
你可以让你的正则表达式不贪婪:
或者,如果您只想在 @
符号后捕获 "This",您可以只使用正后视来尝试这样:
说明
- 积极的回顾
(?<=
- 断言后面是一个
@
- 关闭正面回顾
)
- 匹配一个或多个单词字符
\w+
这是一种非正则表达式方法,或者更确切地说是最小正则表达式方法,因为 grep
通过正则表达式引擎检测 @
grep('@', strsplit(x, ' ')[[1]], value = TRUE)
#[1] "@This"
或者为了避免strsplit
,我们可以使用scan
(取自this answer),即
grep('@', scan(textConnection(x), " "), value=TRUE)
#Read 7 items
#[1] "@This"
正则表达式 ((.*)
) 的中心部分是任意字符的序列。
相反,您应该查找除白色以外的一系列字符 space
(\S+
) 或 字字符 (\w+
).
另请注意,我将 *
更改为 +
,因为您可能不感兴趣
在任何空的字符序列中。
同时捕获在源中具有 "last" 位置的名称
字符串,你的正则表达式的最后部分不仅应该匹配一个序列
白色space个字符,也是字符串的结尾,所以改变
(?=\s+)
到 (?=\s+|$)
.
最后一句话:实际上你不需要括号
"central" 部分。
所以综上所述,整个正则表达式可以是这样的:
(?<=@)\w+(?=\s+|$)
(使用 全局 选项)。
我正在尝试提取文本聊天中标记的用户名,例如“@Jack @Marie 你好!”
我正在尝试结合 @ 和空格来执行此操作,但我无法让正则表达式匹配非贪婪(或者至少我认为这是错误的):
library(stringr)
str_extract(string = '@This is what I want to extract', pattern = "(?<=@)(.*)(?=\s+)")
[1] "This is what I want to"
我想提取的只是 This
。
你可以让你的正则表达式不贪婪:
或者,如果您只想在 @
符号后捕获 "This",您可以只使用正后视来尝试这样:
说明
- 积极的回顾
(?<=
- 断言后面是一个
@
- 关闭正面回顾
)
- 匹配一个或多个单词字符
\w+
这是一种非正则表达式方法,或者更确切地说是最小正则表达式方法,因为 grep
通过正则表达式引擎检测 @
grep('@', strsplit(x, ' ')[[1]], value = TRUE)
#[1] "@This"
或者为了避免strsplit
,我们可以使用scan
(取自this answer),即
grep('@', scan(textConnection(x), " "), value=TRUE)
#Read 7 items
#[1] "@This"
正则表达式 ((.*)
) 的中心部分是任意字符的序列。
相反,您应该查找除白色以外的一系列字符 space
(\S+
) 或 字字符 (\w+
).
另请注意,我将 *
更改为 +
,因为您可能不感兴趣
在任何空的字符序列中。
同时捕获在源中具有 "last" 位置的名称
字符串,你的正则表达式的最后部分不仅应该匹配一个序列
白色space个字符,也是字符串的结尾,所以改变
(?=\s+)
到 (?=\s+|$)
.
最后一句话:实际上你不需要括号 "central" 部分。
所以综上所述,整个正则表达式可以是这样的:
(?<=@)\w+(?=\s+|$)
(使用 全局 选项)。