R strsplit 使用正则表达式
R strsplit using Regex
我想用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"
当我尝试测试 Regex 模式 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"
您可以添加否定先行 (?!^)
以断言不是字符串的开头。
您更新后的行可能如下所示:
chat <- strsplit(example,"(?!^)(?=\[\d\d.\d\d.\d\d, \d\d:\d\d\])",perl=TRUE)
结果
[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"
您可以使用 stringi
并通过稍微修改模式的结尾来提取您想要的信息(即,匹配下一个 [
之前的所有内容)。您可以包含更多您的模式以确保没有任何 false-matches 但这应该让您开始。祝你好运!
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: 6PTT-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: 6Keine 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: 6Schick 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: 6Scheint 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: 6Alles klar, los gehts |Emoji_Relieved_Face| \n"
我想用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"
当我尝试测试 Regex 模式 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"
您可以添加否定先行 (?!^)
以断言不是字符串的开头。
您更新后的行可能如下所示:
chat <- strsplit(example,"(?!^)(?=\[\d\d.\d\d.\d\d, \d\d:\d\d\])",perl=TRUE)
结果
[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"
您可以使用 stringi
并通过稍微修改模式的结尾来提取您想要的信息(即,匹配下一个 [
之前的所有内容)。您可以包含更多您的模式以确保没有任何 false-matches 但这应该让您开始。祝你好运!
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: 6PTT-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: 6Keine 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: 6Schick 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: 6Scheint 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: 6Alles klar, los gehts |Emoji_Relieved_Face| \n"