当两个定界符在字符串中多次出现时,提取两个定界符之间的所有文本

Parseltongue

我有几行聊天数据,其中包含如下所示的成绩单:

“参与者1(我):我不知道答案。参与者2:您怎么看?也许20%?参与者2:我也不知道。参与者1(我):那是我的猜测2:好的,我们去吧!...您怎么看?参与者1(我):肯定!参与者2:好的!参与者2:糟糕!对不起!”

我只想提取前缀Participant 1 (Me):之后的文本,直到它说出Participant 1为止Participant 2之后Participant 1直到紧接上述定界符的所有文本都应存储在名为的变量中participant_1_text我想将所有剩余的文本存储在一个名为的单独变量中participant_2_text,如下所示:

participant_1_text = "I don't know the answer to this. that was my guess. sure!
participant_2_text = "What do you think?   Maybe 20%? I don't know either. ok, let's go for
it! ...what do you think? ok! aww! sorry!"

因此,现在将参与者1的所有文本和参与者2的所有文本分开。

我尝试了以下正则表达式:

(?<=Participant 1)(.*)(?=Participant 2)

但这将匹配这两个定界符的第一次和最后一次出现之间的所有文本,而不是每次匹配。


编辑:我现在尝试获取以下版本的代码并将其应用于包含大量聊天记录的数据框:

因此,使用@akrun的代码,我制作了一个函数,该函数将给定的聊天记录分隔为my_chatpartner_chat返回一个命名列表:

extract_chat <- function(chat_text){
  final_output = chat_text %>% 
    tibble(col1 = chat_text) %>% 
    mutate(col1 = str_replace_all(col1, "Participant", "\nParticipant")) %>% 
    separate_rows(col1, sep="\n") %>% 
    filter(nzchar(col1)) %>% #filter the non-empty strings
    separate(col1, into = c('Participant', "text"), sep=":") %>% 
    group_by(Participant) %>% 
    summarise(text = str_c(text, collapse= ' ')) %>% 
    mutate(Participant = ifelse(str_detect(Participant, "(Me)"), "my_chat_extracted", "partner_chat_extracted")) %>%
    spread(Participant, text)   

  return(list(my_chat_extracted = final_output$my_chat_extracted,
              partner_chat_extracted = final_output$partner_chat_extracted))
}

这似乎工作正常,但是我不确定如何更改数据框中的实际列以使用此功能。

这是要使用的data.frame的示例:

str1 <- "Participant 1 (Me): I don't know the answer to this. Participant 2: What do you think? Maybe 20%? Participant 2: I don't know either. Participant 1 (Me): that was my guess Participant 2: ok, let's go for it! ...what do you think? Participant 1 (Me): sure! Participant 2: ok! Participant 2: aww! sorry!"
str2 <- "Participant 1 (Me): Hey, how are you? Participant 2: I'm good, how about you? Participant 2: I'm excited.  Participant 1 (Me): I'm also good."
test = data.frame(chat = c(str1, str2))

我想做类似的事情:

   tester = test %>% 
      rowwise() %>% 
      mutate(my_chat_extracted = extract_chat(chat)$my_chat_extracted)

但这在我的实际数据集上似乎很慢,而且很草率。

阿克伦

我们可以在Participant(with str_replace_all之前插入下一个行字符,然后在\nwith处分割separate_rowsfilter删除任何空格(nzchar),separate处将其列为两个:,按“参与者”分组,paste将“文本”字符串分成一个字符串

library(dplyr)
library(stringr)
library(tidyr)
out <- tibble(col1 = str1) %>% 
  mutate(col1 = str_replace_all(col1, "Participant", "\nParticipant")) %>% 
  separate_rows(col1, sep="\n") %>% 
  filter(nzchar(col1)) %>%
  separate(col1, into = c('Participant', "text"), sep=":") %>% 
  group_by(Participant = str_remove(Participant, "\\s*\\(.*")) %>% 
  summarise(text = str_c(text, collapse= ' '))

out
# A tibble: 2 x 2
#  Participant   text                                                                                                                    
#  <chr>         <chr>                                                                                                                   
#1 Participant 1 " I don't know the answer to this.   that was my guess   sure! "                                                        
#2 Participant 2 " What do you think? Maybe 20%?   I don't know either.   ok, let's go for it! ...what do you think?   ok!   aww! sorry!"

最好将其保留在中data.frame,但如果需要list2envdeframeing之后使用单独的对象

library(tibble)
list2env(as.list(deframe(out)), .GlobalEnv)
`Participant 1`
#[1] " I don't know the answer to this.   that was my guess   sure! "

数据

str1 <- "Participant 1 (Me): I don't know the answer to this. Participant 2: What do you think? Maybe 20%? Participant 2: I don't know either. Participant 1 (Me): that was my guess Participant 2: ok, let's go for it! ...what do you think? Participant 1 (Me): sure! Participant 2: ok! Participant 2: aww! sorry!"

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

两个相同或不同定界符之间的子字符串(当定界符出现多次时)

存在字符串时如何在两个定界符之间提取文本

如何在两个定界符之间提取字符串

R语言-提取两个定界符之间的字符串

Java中两个定界符之间的子字符串

在字符串中的两个定界符之间应用Perl替换

提取两个相同定界符(多实例定界符)之间的行

在两个定界符之间查找文本

如何删除两个定界符之间的字符?

PHP RegEx替换两个相同定界符之间的字符串

在一行上的两个定界符之间(包括两个定界符)打印文本

在C#中基于两个定界符分割字符串

在C ++中的两个定界符上分割字符串

用两个定界符将字符串分成两列

最好的方法是用两个不同的定界符来分割字符串,将两个词都大写(仅包含一个定界符,然后再添加两个定界符)?

在两个定界符之间替换子字符串,或者直到字符串结尾

如何匹配两个定界符之间的字符串并在后面添加字符串

如何清除两个外部定界符之间的内部定界符

在SQL Server中两个定界符之间提取数据?

RegExp查找并替换两个单独的定界符之间的所有空格

awk删除文本并分割两个定界符

如何用两个定界符分割字符串?

在两个定界符上分割字符串?

我如何使用正则表达式查找并替换行中的所有文本,同时在两个定界符之间保留字符串和空格?

Pandas DataFrame-提取两个字符串之间的字符串,并包含第一个定界符

正则表达式以匹配两个定界符之间的确切字符串

具有两个定界符的csv

如何从两个定界符之间的字符串中获取一个值,然后将另一个值设置为定界符后面的值?

麻烦在awk中的两个定界符