提取模式词后的 n 个词
Extract n words after a pattern word
这是我第一次尝试在 R 中使用 gsub 和正则表达式提取字符串。我想在文本的每个单元格中第一次出现单词“at”或“around”后提取三个单词列(示例中的列)并将提取内容放入新列 (new_extract)。
到目前为止我有以下内容:
df$new_extract <- gsub(".*at(\w{1,}){3}).*", "\1", df$col, perl = TRUE)
欢迎任何关于更改/不同方法的建议!
您的正则表达式仅尝试匹配 last at
之后的单词。此外,由于没有匹配 at
或 around
之间的间隙的模式(顺便说一下,你根本没有尝试匹配 around
),你的模式将不会提取任何单词结束。
我建议这种方法 sub
:
sub(".*?\ba(?:t|round)\W+(\w+(?:\W+\w+){0,2}).*", "\1", df$col, perl=TRUE)
参见regex demo。
这里,
.*?
- 从头开始匹配,除换行字符外的任何零个或多个字符尽可能少
\ba
- 单词边界然后 a
(?:t|round)
- t
或 round
\W+
- 一个或多个非单词字符
(\w+(?:\W+\w+){0,2})
- 第 1 组:一个或多个单词字符,然后是零个、一两次出现的一个或多个非单词字符,后跟一个或多个单词字符
.*
- 尽可能多的除换行符之外的任何零个或多个字符。
这是我第一次尝试在 R 中使用 gsub 和正则表达式提取字符串。我想在文本的每个单元格中第一次出现单词“at”或“around”后提取三个单词列(示例中的列)并将提取内容放入新列 (new_extract)。
到目前为止我有以下内容:
df$new_extract <- gsub(".*at(\w{1,}){3}).*", "\1", df$col, perl = TRUE)
欢迎任何关于更改/不同方法的建议!
您的正则表达式仅尝试匹配 last at
之后的单词。此外,由于没有匹配 at
或 around
之间的间隙的模式(顺便说一下,你根本没有尝试匹配 around
),你的模式将不会提取任何单词结束。
我建议这种方法 sub
:
sub(".*?\ba(?:t|round)\W+(\w+(?:\W+\w+){0,2}).*", "\1", df$col, perl=TRUE)
参见regex demo。
这里,
.*?
- 从头开始匹配,除换行字符外的任何零个或多个字符尽可能少\ba
- 单词边界然后a
(?:t|round)
-t
或round
\W+
- 一个或多个非单词字符(\w+(?:\W+\w+){0,2})
- 第 1 组:一个或多个单词字符,然后是零个、一两次出现的一个或多个非单词字符,后跟一个或多个单词字符.*
- 尽可能多的除换行符之外的任何零个或多个字符。