gsub提取包含空格的文本

时间:2018-08-13 18:02:37

标签: r regex gsub stringr

我正在使用大型(32666行)数据集,其中大多数信息包含在XML格式的单元格中。 XML涉及大约50个字段,我需要分别提取它们以进行进一步分析。如果先从XML中消除所有空格和标点,然后再删除感兴趣的值之前和之后的内容,则可以准确地提取所需的信息。但是,删除空格会导致某些值失去所有意义,因此我一直在尝试解决此问题,但没有成功。

我尝试用“ \ s”替换空格,因为多数民众赞成在正则表达式代码的空间。

   dd3$DataBlob <- gsub("[[:punct:]]", "", dd3$DataBlob)
dd3$DataBlob <- gsub(" ", "\s", dd3$DataBlob)
    dd3$DataBlob <- as.character(dd3$DataBlob)

我尝试在下面的替换中使用“ \ s”和“ \\ s”

gsub('.*OWTTisLevBone\\sCheckBoxControl\\sTypePrm\\sCheckBoxParent\\sNameOWTSHARPDEBRIDGroupBox\\sValue', "", dd3$DataBlob)

我不知道从这里去哪里。由于DataBlob单元格的大小,我不能使用纯正则表达式代码(如果我将其复制/粘贴到6页长的Word中)。

在这种情况下,这就是原始XML与关注领域有关的样子。它的前面是xml的4页,然后是另外2页,因此我无法提供全部内容。 我需要的信息始终遵循“标签=”,因此该值将为“ Bone”。如果所需的信息只有一个单词,那么删除空格然后使用所包含的第一组代码会很好地工作像此示例一样,但其他字段包含完整的句子,我需要能够准确地解释它们。

   <OWT_TisLev_Bone_CheckBox ControlType="PrmCheckBox" ParentName="OWT_SHARPDEBRID_GroupBox" Value="false" Label="Bone" /><OWT_TisLev_Tendon 

由于Datablob的大小和信息的性质,我无法提供head()或数据,但是这里是str()。

'data.frame':   31266 obs. of  6 variables:
 $ GroupingUid: Factor w/ 5611 levels "00090D62-27C2-XXXX-XXXX",..: 1751 3980 1228 5240 1356 874 2861 3902 2070 3939 ...
 $ PatientID  : int  XXXXX XXXXX XXXXX XXXXX XXXXXX  ...
 $ Provider   : Factor w/ 12 levels "Anthony, F.",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ ServiceSite: Factor w/ 83 levels "Abby",..: 61 61 61 48 61 61 61 61 48 50 ...
 $ VisitDate  : Factor w/ 131 levels "1/10/2018","1/11/2018",..: 15 15 15 15 15 15 15 15 15 15 ...
 $ DataBlob   : chr  Factor w/ 24009 levels "<data><current><donotuse1 ControlType=\"PrmGroupBox\" Label=\"\" Value=\"\" /><HS_Initial_Onset_TextBox Control"| __truncated__,..

3 个答案:

答案 0 :(得分:0)

 a = '<OWT_TisLev_Bone_CheckBox ControlType="PrmCheckBox" ParentName="OWT_SHARPDEBRID_GroupBox" Value="false" Label="Bone" /><OWT_TisLev_Tendon'
> sub('.*Label\\s*="(\\w+).*',"\\1",a)
[1] "Bone"

答案 1 :(得分:0)

怎么样:

library(stringr)

str_extract_all(dd3$DataBlob, '(?<=Label=\\\")\\w+')


[1] "Bone"

答案 2 :(得分:0)

怎么样呢?

a = '<OWT_TisLev_Bone_CheckBox ControlType="PrmCheckBox" ParentName="OWT_SHARPDEBRID_GroupBox" Value="false" Label="Bone" /><OWT_TisLev_Tendon'
b = '<OWT_TisLev_Bone_CheckBox ControlType="PrmCheckBox" ParentName="OWT_SHARPDEBRID_GroupBox" Value="false" Label="Bone and muscles and eyes and legs" /><OWT_TisLev_Tendon'

library(tidyverse)

grab_target <- function(string, target){
    values <- str_extract_all(string, "(?!\\s)(?<=\").*?(?=\")") %>% unlist()
    names <- str_extract_all(string, "(?<=\\s).*?(?==)") %>% unlist()
    data.frame(names = names, values = values, stringsAsFactors = FALSE) %>% 
        filter(names == target) %>% .[1, "values"] 
}

grab_target(a, "Label")
[1] "Bone"
grab_target(a, "ParentName")
[1] "OWT_SHARPDEBRID_GroupBox"
grab_target(b, "Label")
[1] "Bone and muscles and eyes and legs"
grab_target(b, "Value")
[1] "false"

这样,如果您想在其他目标词(例如“ Value”或“ ParentName”)之后提取内容,则无需再次摆弄正则表达式。