正则表达式连续3个单词(如果有)

时间:2018-07-18 15:36:25

标签: r regex

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

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

结果是:

"Stack is great"
"Stack" 

此答案对我不起作用:regex: matching 3 consecutive words

我的努力:

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

1 个答案:

答案 0 :(得分:3)

您可以使用

> 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 demoonline R demo以及备用regex demo

请注意,正则表达式将从任何字符串中提取第一个包含1个,2个或3个字母的单词的块。如果您至少需要2个单词,请将{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}构造的正则表达式一起使用。如果不起作用,请尝试在模式的开头添加(*UCP) PCRE动词,以使所有泛型/ Unicode /速记类都真正了解Unicode。

请注意,所有这些正则表达式均可与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 regex支持,而不是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"