R中的Regex:从字符串

时间:2017-02-27 17:35:17

标签: r regex

我想知道是否可以从用逗号分隔的字符串中提取关键字。例如,如果文字说

This is a random text Keywords: a, b, c Hi stack overflow

它应该返回

a, b, c

我认为如果关键字只是一个单词,这应该很容易。在这种情况下,如果单词后面没有逗号(这意味着您位于关键字列表的末尾),您可以告诉正则表达式停止查找单词。 但是,如果关键字包含多个单词,该怎么办?例如文字说

Hi stackoverflow Keywords: a, b, stack overflow Some more text

它应该返回

a, b, stack overflow

请注意,关键字列表后面的第一个单词以大写字母开头,那么是否可以使用它并告诉正则表达式查找单词直到找到大写字母的位置?

数据

x <- c(
  'This is a random text Keywords: a, b, c Hi stack overflow',
  'Hi stackoverflow Keywords: a, b, stack overflow Some more text'
)

3 个答案:

答案 0 :(得分:0)

以下正则表达式可以胜任:

.*?(?:Keywords:?\s)(.*?,.*?,.*?(?<!,)(?=\s[A-Z])).*?$

参见 demo / explanation

<强> - [R

x <- c(
  'This is a random text Keywords AA, bB, CC Hi stack overflow',
  'Hi stackoverflow Keywords: a, b, STaCk oVerFlow Some more text'
)
gsub('.*?(?:Keywords:?\\s)(.*?,.*?,.*?(?<!,)(?=\\s[A-Z])).*?$','\\1', x, perl=T)

答案 1 :(得分:0)

此正则表达式[a-z]+\s*(?:,\s*(?:\s*[a-z])+)+会将一组关键字作为字符串 每个匹配必须用逗号分隔才能获得各个关键字。

 [a-z]+                        # 1st keyword
 \s*                           # optional space
 (?:                           # Group start, remaining keywords
      ,                             # comma
      \s*                           # optional space
      (?:                           # Group start
           \s*                           # optional space
           [a-z]                         # letter
      )+                            # Group end, 1 or more times
 )+                            # Group end, 1 or more times

输出

 **  Grp 0 -  ( pos 32 , len 7 ) 
a, b, c  
 **  Grp 0 -  ( pos 86 , len 19 ) 
a, b stack overflow  

答案 2 :(得分:0)

环顾四周(?&lt; = \ :),环顾四周(?= [A-Z]),提取(。*)

gsub('.*(?<=\\:)(.*)(?=[A-Z]).*','\\1',x,perl=T)
[1] " a, b, c "              " a, b, stack overflow "