如何使用正则表达式来匹配首字母顺序相邻的两个单词?

问题描述 投票:0回答:1

我最近了解到

()
可以用于定义正则表达式中的模式,并且使用
\\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)。

我希望我的描述很清楚,并且我很感激任何能达到预期结果的提示。谢谢。

r regex stringr
1个回答
0
投票

创建一个函数

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.")
© www.soinside.com 2019 - 2024. All rights reserved.