在第一个关闭字符实例之后执行gsub,而不是继续到字符串末尾

时间:2018-09-07 18:02:10

标签: r regex gsub

我有一个数据集,其中的列是调查问题,行中的值包含被回答者选择的答案以及多个HTML标记。我正在尝试删除所有HTML标签,仅保留答案文本。

在Excel中,这可以通过用空字符串代替<*>来完成。我无法弄清楚如何在R中执行此操作,因为我遇到的问题是我无法使通配符在第一个大于括号之后停止。相反,它只是将其识别为通配符的一部分,并继续到字符串的末尾。我在下面包括了一个玩具数据集和我的尝试。

temp <- data.frame(one = c('<b style="font-weight: normal;"><span style="font-size: 12pt; font-family: "Times New Roman";white-space: pre-wrap;">Answer 1</span></b>',
                         '<b style="font-weight: normal;"><span style="font-size: 12pt; font-family: "Times New Roman";white-space: pre-wrap;">Answer 2</span></b>',
                         '<b style="font-weight: normal;"><span style="font-size: 12pt; font-family: "Times New Roman";white-space: pre-wrap;">Answer 3</span></b>'),
                   two = c('<b style="font-weight: normal;"><span style="font-size: 12pt; font-family: "Times New Roman";white-space: pre-wrap;">apples are red</span></b>',
                         '<b style="font-weight: normal;"><span style="font-size: 12pt; font-family: "Times New Roman";white-space: pre-wrap;">apples are blue</span></b>',
                         '<b style="font-weight: normal;"><span style="font-size: 12pt; font-family: "Times New Roman";white-space: pre-wrap;">apples are bananas</span></b>'))


temp[] <- sapply(temp, function(x) gsub('<.*>+', "", x))

# what I want the new temp to look like (above code results in empty strings
data.frame(one = c("Answer 1", 
                   "Answer 2", 
                   "Answer 3"),
           two = c("apples are red",
                   "apples are blue", 
                   "apples are bananas

我尝试将代码用于第n次出现,但仍在第一个实例到字符串末尾继续使用。

我缺少使它在第一个实例后终止的正则表达式命令是什么?另外,我假设它将在完成第一次删除后继续移动到下一行,从而迫使我运行gsub() n次,其中n是任何给定列中标签的最大数目。这不是特别有问题,但是有解决方法吗?

2 个答案:

答案 0 :(得分:1)

regex文档中查看以下摘录:

  

默认情况下,重复是贪婪的,因此最大重复次数为   使用重复。可以通过将?附加到以下来将其更改为“最小”   量词。 (还有更多的量词可以近似   匹配:请参阅TRE文档。)

temp[] <- sapply(temp, function(x) gsub('<.*?>', "", x))

       one                two
1 Answer 1     apples are red
2 Answer 2    apples are blue
3 Answer 3 apples are bananas

要回答您的第二个问题,gsub将替换所有匹配项(而不是sub,后者仅替换第一个匹配项)-因此您应该没事。

答案 1 :(得分:1)

使用df.dropna(subset=[df.columns[1]]) Out[407]: index value 0 1 2.0 1 2 6.0 3 4 8.0 ,我们可以提取str_extract>之间的单词字符和空格:

<

输出:

library(stringr)
library(dplyr)

temp %>%
  mutate_all(str_extract, "(?<=\\>)[\\w\\s]+(?=\\<)")