【问题标题】:Extract char sequences within a string提取字符串中的字符序列
【发布时间】:2018-06-04 21:26:47
【问题描述】:

我想从这个字符串中提取所有非大写字母的文本:

a <- "NAME
Agricola, Johannes
ALTERNATIVNAMEN
Schneider, Johann; Schnitter, Johannes; Eisleben, Johannes; Agricola Eisleben, Johannes; Bauer, Hans
KURZBESCHREIBUNG
deutscher Reformator
GEBURTSDATUM
20. April 1494
GEBURTSORT
Eisleben
STERBEDATUM
22. September 1566
STERBEORT
Berlin"

为了提取“Agricola, Johannes”,我尝试了类似的方法:

# Name
name <- sub("\\s*ALTERNATIVNAMEN\\b.*", "", a)
cat(sub("NAME", "", name))

但我不知道如何继续。我的问题是我不知道如何使用正则表达式表达以下内容:“匹配 NAME 之后的所有内容,直到 ALTERNATIVNAMEN”。最后,我希望有 7 个变量将个人数据保存为角色对象。非常感谢任何帮助!

【问题讨论】:

    标签: r regex


    【解决方案1】:
    read.table(text=gsub("([[:upper:]])\\n","\\1:",a),sep=":")
                    V1                                                                                                   V2
    1             NAME                                                                                   Agricola, Johannes
    2  ALTERNATIVNAMEN Schneider, Johann; Schnitter, Johannes; Eisleben, Johannes; Agricola Eisleben, Johannes; Bauer, Hans
    3 KURZBESCHREIBUNG                                                                                 deutscher Reformator
    4     GEBURTSDATUM                                                                                       20. April 1494
    5       GEBURTSORT                                                                                             Eisleben
    6      STERBEDATUM                                                                                   22. September 1566
    7        STERBEORT                                                                                               Berlin
    

    然后你可以选择你想要的列

    【讨论】:

    • 太好了,这似乎是另一种选择!但是为什么read.table函数的分隔符是冒号呢?
    • gsub 函数用冒号替换每个大写单词末尾的换行符。这成为你的分隔符..
    • 现在我完全理解你的回答了!
    【解决方案2】:

    您可以使用strsplit 并以两个或多个大写字母的任意顺序进行拆分...

    strsplit(a,"[A-Z]{2,}")
    
    [[1]]
    [1] ""                                                                                                        
    [2] "\nAgricola, Johannes\n"                                                                                  
    [3] "\nSchneider, Johann; Schnitter, Johannes; Eisleben, Johannes; Agricola Eisleben, Johannes; Bauer, Hans\n"
    [4] "\ndeutscher Reformator\n"                                                                                
    [5] "\n20. April 1494\n"                                                                                      
    [6] "\nEisleben\n"                                                                                            
    [7] "\n22. September 1566\n"                                                                                  
    [8] "\nBerlin"
    

    【讨论】:

    • 太棒了!但是我如何将每个子字符串存储到一个变量中?在这种情况下如何摆脱“\n”?
    • gsub("\n", "", a) 负责后者
    • as.data.frame(gsub("\\n","",do.call(rbind,strsplit(a,"[A-Z]{2,}")))) 之类的东西会将as 的向量转换为所需变量的数据框。
    • 完美——这正是我想要的!
    • 试试read.table(text=gsub("([[:upper:]])\\n","\\1:",a),sep=":")
    猜你喜欢
    • 2020-07-06
    • 2018-12-06
    • 2021-01-22
    • 2021-11-07
    • 1970-01-01
    • 2014-02-13
    • 1970-01-01
    相关资源
    最近更新 更多