【问题标题】:R strsplit using RegexR strsplit 使用正则表达式
【发布时间】:2019-11-22 09:54:24
【问题描述】:

我想用R来拆分一些聊天消息,这里是一个例子:

example <- "[29.01.18, 23:33] Alice: Ist das hier ein Chatverlauf?\n[29.01.18, 23:45] Bob: Ja ist es!\n[29.01.18, 23:45] Bob: Der ist dazu da die funktionsweise des Parsers zu demonstrieren\n[29.01.18, 23:46] Alice: ‎PTT-20180129-WA0025.opus (Datei angehängt)\n[29.01.18, 23:46] Bob: Ah, er kann also auch erkennen ob Voicemails gesendet wurden!\n[29.01.18, 23:46] Bob: Das ist praktisch!\n[29.01.18, 23:47] Bob: Oder?\n[29.01.18, 23:47] Alice: ja |Emoji_Grinning_Face_With_Smiling_Eyes| \n[29.01.18, 23:47] Alice: und Emojis gehen auch!\n[29.01.18, 23:47] Bob: Was ist mit normalen Smilies?\n[29.01.18, 23:49] Alice: ‎Keine Ahnung, lass uns das doch mal ausprobieren\n[29.01.18, 23:50] Bob: Alles klar :) :D\n[29.01.18, 23:51] Alice: Scheint zu funktionieren!:P\n[29.01.18, 23:51] Bob: Meinst du, dass URLS auch erkannt werden?\n[29.01.18, 23:52] Bob: ‎Schick doch mal eine zum ausprobieren!\n[29.01.18, 23:53] Alice: https://github.com/JuKo007\n[29.01.18, 23:58] Alice: ‎Scheint zu funktionieren!\n[29.01.18, 23:59] Alice: Sehr schön!\n[30.01.18, 00:00] Alice: Damit sollten sich WhatsApp Verläufe besser quantifizieren lassen!\n[30.01.18, 00:02] Bob: ‎Alles klar, los gehts  |Emoji_Relieved_Face| \n"

基本上,我想在括号中的日期时间指示器前面拆分字符串,这是我迄今为止尝试过的:

  # Cutting the textblock into individual messages
  chat <- strsplit(example,"(?=\\[\\d\\d.\\d\\d.\\d\\d, \\d\\d:\\d\\d\\])",perl=TRUE)
  chat <- unlist(chat)

奇怪的是,在输出中,拆分似乎发生在第一个方括号之后,而不是在前面:

 [1] "["                                                                                           
 [2] "29.01.18, 23:33] Alice: Ist das hier ein Chatverlauf?\n"                                     
 [3] "["                                                                                           
 [4] "29.01.18, 23:45] Bob: Ja ist es!\n"                                                          
 [5] "["                                                                                           
 [6] "29.01.18, 23:45] Bob: Der ist dazu da die funktionsweise des Parsers zu demonstrieren\n"     
 [7] "["                                                                                           
 [8] "29.01.18, 23:46] Alice: ‎PTT-20180129-WA0025.opus (Datei angehängt)\n"                        
 [9] "["                                                                                           
[10] "29.01.18, 23:46] Bob: Ah, er kann also auch erkennen ob Voicemails gesendet wurden!\n"       
[11] "["                                                                                           
[12] "29.01.18, 23:46] Bob: Das ist praktisch!\n"                                                  
[13] "["                                                                                           
[14] "29.01.18, 23:47] Bob: Oder?\n"                                                               
[15] "["                                                                                           
[16] "29.01.18, 23:47] Alice: ja |Emoji_Grinning_Face_With_Smiling_Eyes| \n"                       
[17] "["                                                                                           
[18] "29.01.18, 23:47] Alice: und Emojis gehen auch!\n"                                            
[19] "["                                                                                           
[20] "29.01.18, 23:47] Bob: Was ist mit normalen Smilies?\n"                                       
[21] "["                                                                                           
[22] "29.01.18, 23:49] Alice: ‎Keine Ahnung, lass uns das doch mal ausprobieren\n"                  
[23] "["                                                                                           
[24] "29.01.18, 23:50] Bob: Alles klar :) :D\n"                                                    
[25] "["                                                                                           
[26] "29.01.18, 23:51] Alice: Scheint zu funktionieren!:P\n"                                       
[27] "["                                                                                           
[28] "29.01.18, 23:51] Bob: Meinst du, dass URLS auch erkannt werden?\n"                           
[29] "["                                                                                           
[30] "29.01.18, 23:52] Bob: ‎Schick doch mal eine zum ausprobieren!\n"                              
[31] "["                                                                                           
[32] "29.01.18, 23:53] Alice: https://github.com/JuKo007\n"                                        
[33] "["                                                                                           
[34] "29.01.18, 23:58] Alice: ‎Scheint zu funktionieren!\n"                                         
[35] "["                                                                                           
[36] "29.01.18, 23:59] Alice: Sehr schön!\n"                                                       
[37] "["                                                                                           
[38] "30.01.18, 00:00] Alice: Damit sollten sich WhatsApp Verläufe besser quantifizieren lassen!\n"
[39] "["                                                                                           
[40] "30.01.18, 00:02] Bob: ‎Alles klar, los gehts  |Emoji_Relieved_Face| \n" 

当我尝试测试正则表达式模式online 或在 python 中使用它时,它按预期工作,所以对我来说,这似乎是 strsplit 函数的一个特性?非常欢迎任何有关如何更改我的 R 代码以使其工作的建议!我知道将这个输出重新粘贴在一起以获得我想要的输出很容易,但我真的很想了解 strsplit 发生了什么并正确地执行它,而不是将它重新修补在一起。我想要的是:

 [1] "[29.01.18, 23:33] Alice: Ist das hier ein Chatverlauf?\n"                                                                                                                           
 [2] "[29.01.18, 23:45] Bob: Ja ist es!\n"                                                                                                                                                  
 [3] "[29.01.18, 23:45] Bob: Der ist dazu da die funktionsweise des Parsers zu demonstrieren\n"                                                                                         
 [4] "[29.01.18, 23:46] Alice: ‎PTT-20180129-WA0025.opus (Datei angehängt)\n"                                                                                                      
[5] "[29.01.18, 23:46] Bob: Ah, er kann also auch erkennen ob Voicemails gesendet wurden!\n"                                                                                          
[6] "[29.01.18, 23:46] Bob: Das ist praktisch!\n"                                                                                                                                    
[7] "[29.01.18, 23:47] Bob: Oder?\n"                                                                                                                                                   
[8] "[29.01.18, 23:47] Alice: ja |Emoji_Grinning_Face_With_Smiling_Eyes| \n"                                                                                                            
[9] "[29.01.18, 23:47] Alice: und Emojis gehen auch!\n"                                                                                                                          
[10] "[29.01.18, 23:47] Bob: Was ist mit normalen Smilies?\n"                                                                                                                         
[11] "[29.01.18, 23:49] Alice: ‎Keine Ahnung, lass uns das doch mal ausprobieren\n"                                                                                                    
[12] "[29.01.18, 23:50] Bob: Alles klar :) :D\n"                                                                                                                                       
[13] "[29.01.18, 23:51] Alice: Scheint zu funktionieren!:P\n"                                                                                                                        
[14] "[29.01.18, 23:51] Bob: Meinst du, dass URLS auch erkannt werden?"                                                                                                             
[15] "[29.01.18, 23:52] Bob: ‎Schick doch mal eine zum ausprobieren!\n"                                                                                                                       
[16] "[29.01.18, 23:53] Alice: https://github.com/JuKo007\n"                                                                                                                                  
[17] "[29.01.18, 23:58] Alice: ‎Scheint zu funktionieren!\n"                                                                                                                                  
[18] "[29.01.18, 23:59] Alice: Sehr schön!\n"                                                                                                                                                
[19] "[30.01.18, 00:00] Alice: Damit sollten sich WhatsApp Verläufe besser quantifizieren lassen!\n"                                                                                           
[20] "[30.01.18, 00:02] Bob: ‎Alles klar, los gehts  |Emoji_Relieved_Face| \n" 

【问题讨论】:

  • 我想你已经收到了正确的答案。以防万一您想要一种更自动化的方式来处理 WhatsApp 数据,您可以查看这个包:github.com/JBGruber/rwhatsapp
  • 哇,谢谢你给我指点你的包裹!这确实很方便!事实上,我正在为我目前正在进行的一个研究项目编写一个解析器。我的(仍然相对空的仓库)在这里:github.com/JuKo007/WhatsAppParser
  • 我认为我的解析器已经准备好了并且很健壮。到目前为止,我没有在 CRAN 上发布的唯一原因是我认为这对 R 包来说是一个相当小的贡献。如果你想投入一些工作,你可以添加到我的回购(问题和 PR)。我很高兴将您添加为重要 PR 的贡献者。

标签: r regex strsplit


【解决方案1】:

您可以添加一个否定的前瞻(?!^) 来断言不是字符串的开头。

您更新后的行可能如下所示:

chat <- strsplit(example,"(?!^)(?=\\[\\d\\d.\\d\\d.\\d\\d, \\d\\d:\\d\\d\\])",perl=TRUE)

R demo

结果

 [1] "[29.01.18, 23:33] Alice: Ist das hier ein Chatverlauf?\n"                                     
 [2] "[29.01.18, 23:45] Bob: Ja ist es!\n"                                                          
 [3] "[29.01.18, 23:45] Bob: Der ist dazu da die funktionsweise des Parsers zu demonstrieren\n"     
 [4] "[29.01.18, 23:46] Alice: ‎PTT-20180129-WA0025.opus (Datei angehängt)\n"                        
 [5] "[29.01.18, 23:46] Bob: Ah, er kann also auch erkennen ob Voicemails gesendet wurden!\n"       
 [6] "[29.01.18, 23:46] Bob: Das ist praktisch!\n"                                                  
 [7] "[29.01.18, 23:47] Bob: Oder?\n"                                                               
 [8] "[29.01.18, 23:47] Alice: ja |Emoji_Grinning_Face_With_Smiling_Eyes| \n"                       
 [9] "[29.01.18, 23:47] Alice: und Emojis gehen auch!\n"                                            
[10] "[29.01.18, 23:47] Bob: Was ist mit normalen Smilies?\n"                                       
[11] "[29.01.18, 23:49] Alice: ‎Keine Ahnung, lass uns das doch mal ausprobieren\n"                  
[12] "[29.01.18, 23:50] Bob: Alles klar :) :D\n"                                                    
[13] "[29.01.18, 23:51] Alice: Scheint zu funktionieren!:P\n"                                       
[14] "[29.01.18, 23:51] Bob: Meinst du, dass URLS auch erkannt werden?\n"                           
[15] "[29.01.18, 23:52] Bob: ‎Schick doch mal eine zum ausprobieren!\n"                              
[16] "[29.01.18, 23:53] Alice: https://github.com/JuKo007\n"                                        
[17] "[29.01.18, 23:58] Alice: ‎Scheint zu funktionieren!\n"                                         
[18] "[29.01.18, 23:59] Alice: Sehr schön!\n"                                                       
[19] "[30.01.18, 00:00] Alice: Damit sollten sich WhatsApp Verläufe besser quantifizieren lassen!\n"
[20] "[30.01.18, 00:02] Bob: ‎Alles klar, los gehts  |Emoji_Relieved_Face| \n"    

【讨论】:

    【解决方案2】:

    您可以使用stringi 并通过稍微修改模式的结尾来提取您想要的信息(即,匹配所有内容直到下一个[)。您可以包含更多模式以确保没有任何错误匹配,但这应该可以帮助您入门。祝你好运!

    library(stringi)
    
    stri_extract_all(example, regex = "\\[\\d\\d.\\d\\d.\\d\\d, \\d\\d:\\d\\d\\][^\\[]*")
    [[1]]
     [1] "[29.01.18, 23:33] Alice: Ist das hier ein Chatverlauf?\n"                                     
     [2] "[29.01.18, 23:45] Bob: Ja ist es!\n"                                                          
     [3] "[29.01.18, 23:45] Bob: Der ist dazu da die funktionsweise des Parsers zu demonstrieren\n"     
     [4] "[29.01.18, 23:46] Alice: \016PTT-20180129-WA0025.opus (Datei angehängt)\n"                    
     [5] "[29.01.18, 23:46] Bob: Ah, er kann also auch erkennen ob Voicemails gesendet wurden!\n"       
     [6] "[29.01.18, 23:46] Bob: Das ist praktisch!\n"                                                  
     [7] "[29.01.18, 23:47] Bob: Oder?\n"                                                               
     [8] "[29.01.18, 23:47] Alice: ja |Emoji_Grinning_Face_With_Smiling_Eyes| \n"                       
     [9] "[29.01.18, 23:47] Alice: und Emojis gehen auch!\n"                                            
    [10] "[29.01.18, 23:47] Bob: Was ist mit normalen Smilies?\n"                                       
    [11] "[29.01.18, 23:49] Alice: \016Keine Ahnung, lass uns das doch mal ausprobieren\n"              
    [12] "[29.01.18, 23:50] Bob: Alles klar :) :D\n"                                                    
    [13] "[29.01.18, 23:51] Alice: Scheint zu funktionieren!:P\n"                                       
    [14] "[29.01.18, 23:51] Bob: Meinst du, dass URLS auch erkannt werden?\n"                           
    [15] "[29.01.18, 23:52] Bob: \016Schick doch mal eine zum ausprobieren!\n"                          
    [16] "[29.01.18, 23:53] Alice: https://github.com/JuKo007\n"                                        
    [17] "[29.01.18, 23:58] Alice: \016Scheint zu funktionieren!\n"                                     
    [18] "[29.01.18, 23:59] Alice: Sehr schön!\n"                                                       
    [19] "[30.01.18, 00:00] Alice: Damit sollten sich WhatsApp Verläufe besser quantifizieren lassen!\n"
    [20] "[30.01.18, 00:02] Bob: \016Alles klar, los gehts  |Emoji_Relieved_Face| \n"   
    

    【讨论】:

    • 是的,这适用于我在此处发布的特定示例,但在文件中,有很多情况下消息中也有换行符,所以这不起作用。我应该把这个包括在例子中,我的错!
    • 别担心——如果你更新,我会编辑或删除它,如果我不能破解它。
    • @JuKo,刚刚更新。希望这会更好!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 2020-08-24
    • 2012-02-08
    • 2022-06-16
    • 2021-10-16
    相关资源
    最近更新 更多