我最近了解到
()
可以用于定义正则表达式中的模式,并且使用\\1
可以引用()
中定义的第一组字符串。
这是一个强大的想法,因为我可以用它来提取以同一字母开头的两个单词。例如:
# Load the package:
library(stringr)
# Define a list of example sentences:
sentences <- c("She likes butter chicken.",
"He loves mango.",
"Lara makes nuggets.",
"We want help.")
# Extract the matched two words, which follows the pattern defined below:
str_extract_all(string = sentences,
pattern = regex(pattern = "\\b(\\w)\\w*\\s\\b\\1\\w*\\b",
ignore_case = TRUE))
这是我使用的正则表达式
\\b(\\w)\\w*\\s\\b\\1\\w*\\b
的细分:\\b
:第一个单词开始的单词边界(\\w)
:单词字符作为第一个模式,这里指的是第一个单词的第一个字母\\w*
:更多单词字符,这里指第一个单词的其余字母\\b
:第一个单词结束的单词边界\\s
:空白\\b
:第二个单词开始的单词边界\\1
:第一个模式,这里指的是第二个单词的第一个字母\\w*
:更多单词字符,这里指的是第二个单词的剩余字母\\b
:第二个单词结束的单词边界
我会得到预期的结果:
[[1]]
character(0)
[[2]]
character(0)
[[3]]
character(0)
[[4]]
[1] "We want"
我只是想知道,如何修改正则表达式,以便它可以提取两个首字母按字母顺序相邻的单词?例如,我希望匹配这些单词(在
*
之间标记):
c("She likes *butter chicken*.",
"He *loves mango*.",
"Lara *makes nuggets*.",
"We want help.")
butter chicken
、loves mango
和 makes nuggets
将被匹配,因为对于每个组,它们的第一个字母是相邻的 ^:(例如 b
在 c
之前)。
^:假设仅降序(即从 A -> Z)。
我希望我的描述很清楚,并且我很感激任何能达到预期结果的提示。谢谢。
创建一个函数
conseq
,它接受长度为 2 的字符向量 x
,如果 x[2]
的第一个字母紧跟在字母表中 x[1]
的第一个字母后面,则返回 it,否则返回 NULL。然后将其应用于每对连续的单词。我们假设不区分大小写。
library (zoo)
conseq <- function(x) {
first <- substring(tolower(x), 1, 1)
if (isTRUE(match(first[2], letters) ==
match(first[1], letters) + 1)) x
}
lapply(strsplit(sentences, "[^a-zA-Z]+"),
rollapply, width = 2, conseq)
给予
[[1]]
[,1] [,2]
[1,] "butter" "chicken"
[[2]]
[,1] [,2]
[1,] "loves" "mango"
[[3]]
[,1] [,2]
[1,] "Lara" "makes"
[2,] "makes" "nuggets"
[[4]]
numeric(0)
从问题中获取的输入
sentences <- c("She likes butter chicken.",
"He loves mango.",
"Lara makes nuggets.",
"We want help.")