r-正则表达式表示3个连续单词(如果有的话)



我正在寻找能够提取3个连续单词(如果有的话(的正则表达式。例如,如果我有两个字符串:

"1. Stack is great and awesome"
"2. Stack"

结果是:

"Stack is great"
"Stack" 

这个答案对我不起作用:regex:匹配3个连续单词

我的努力:

(?:[A-ZŠČĆŽa-zščćž]+ )(?:[A-ZŠČĆŽa-zščćž]+ )(?:[A-ZŠČĆŽa-zščćž]+ )

您可以使用

> x <- c("1. Stack is great and awesome", "2. Stack")
> regmatches(x, regexpr("[A-Za-z]+(?:\s+[A-Za-z]+){0,2}", x))
[1] "Stack is great" "Stack"
## Or to support all Unicode letters
> y <- c("1. Stąck is great and awesome", "2. Stack")
> regmatches(y, regexpr("\p{L}+(?:\s+\p{L}+){0,2}", y, perl=TRUE))
[1] "Stąck is great" "Stack"
## In some R environments, it makes sense to use another, TRE, regex:
> regmatches(y, regexpr("[[:alpha:]]+(?:[[:space:]]+[[:alpha:]]+){0,2}", x))
[1] "Stąck is great" "Stack"

请参阅regex演示和在线R演示以及另一个regex演示。

请注意,正则表达式将从任何字符串中提取第一块1、2或3个字母的单词。如果您至少需要两个单词,请将{0,2}限定量词替换为{1,2}限定量词。

要提取多个匹配项,请使用gregexpr而不是regexpr

图案详细信息

  • \p{L}+/[A-Za-z]-任何1+Unicode(如果使用[A-Za-z],则为ASCII(字母
  • (?:\s+\p{L}+){0,2}/(?:\s+[a-zA-Z]+){0,2}-0、1或2次连续出现:
    • \s+-1+空白
    • \p{L}+/[A-Za-z]-任何1+Unicode(如果使用[A-Za-z],则为ASCII(字母

请注意将perl=TRUE参数与使用p{L}构造的regex一起使用。如果不起作用,请尝试在模式的最开始添加(*UCP)PCRE动词,使所有通用/Unicode/简写类真正具有Unicode意识。

请注意,所有这些regexp都将与stringr::str_extractstringr::str_extract_all:一起使用

> str_extract(x, "\p{L}+(?:\s+\p{L}+){0,2}")
[1] "Stack is great" "Stack"         
> str_extract(x, "[a-zA-Z]+(?:\s+[a-zA-Z]+){0,2}")
[1] "Stack is great" "Stack"         
> str_extract(x, "[[:alpha:]]+(?:\s+[[:alpha:]]+){0,2}")
[1] "Stack is great" "Stack" 

这里不支持(*UCP),因为stringr函数是由ICU正则表达式提供的,而不是PCRE。Unicode测试:

> str_extract(y, "\p{L}+(?:\s+\p{L}+){0,2}")
[1] "Stąck iç great" "Stack"         
> str_extract(y, "[[:alpha:]]+(?:\s+[[:alpha:]]+){0,2}")
[1] "Stąck iç great" "Stack"         

相关内容

最新更新