如何使用大写字母模式拆分文本/字符串?

How to split a text / string with pattern of upper case letters?

我想根据每个对话者拆分文本。

原文是这样的形式:

this is a speech text. FIRST PERSON: hi all, thank you for coming. SECOND PERSON: thank you for inviting us. TERCER PERSONA QUE SE LLAMA PEDRO: soy de acuerdo. CUARTA PERSONA (JOHN): Hi. How are you

我正在搜索这样的最终结果:

第一列:第一人称|第二人称| TERCER PERSONA QUE SE LLAMA PEDRO | CUARTA PERSONA(约翰)

第二栏:大家好,感谢大家的到来 |感谢你邀请我们 |大豆 |你好。你好吗

最后的结果也可以是其他格式或整形。

要拆分的Pattern是一个或多个Upper Word和一个“:”,但一个难点是大写字母的Pattern可以有可选字符,如:():,;

其实我搜索拆分的原文是这个: https://lopezobrador.org.mx/2021/01/14/version-estenografica-de-la-conferencia-de-prensa-matutina-del-presidente-andres-manuel-lopez-obrador-458/

我使用 stringr rebus 和 qdap 尝试过不同的方法。 第一次尝试这种模式:

pattern_mayusc <- UPPER %R% one_or_more(UPPER) %R% optional(") ") %R% ":"

接下来我尝试提取一个向量,其中包含每个对话者的名字,以便将它们用作下一个模式:

mayuscula<-sapply(str_extract_all(text, ".([A-Z]+:)"), paste, collapse= ' ')

我很接近得到我想要的但无法实现。有人帮我吗? 非常感谢

您可以在匹配 : 的模式上使用 strsplit 15=]) 和圆括号(如果需要的话,还有更多),或 (|) space,后跟相同的序列。我们想要结果列表中的第一个 el 元素并用 trimws 清理。结果是说话人和文本的交替模式,我们可以很容易地将其转换为两列 matrix 行。

pat <- r"{(?>\p{Lu}+?\s?)+\(?\p{Lu}+\)?\K(:)|(?<!\w)(\s)(?=\p{Lu}{2,})}"
# pat <- "(?>\p{Lu}+?\s?)+\(?\p{Lu}+\)?\K(:)|(?<!\w)(\s)(?=\p{Lu}{2,})"  ## for R < 4.0.0

tmp <- trimws(el(strsplit(x, pat, perl=TRUE)))[-1]
res <- matrix(tmp, ncol=2, byrow=TRUE)
res
#      [,1]                                 [,2]                           
# [1,] "FIRST PERSON"                       "hi all, thank you for coming."
# [2,] "SECOND PERSON"                      "thank you for inviting us."   
# [3,] "TERCER PERSONA QUE SE LLAMA ANDRÉS" "soy de acuerdo."              
# [4,] "CUARTA PERSONA (JOHN)"              "Hi. How are you?"             
# [5,] "ANDRÉS"                             "Hola buenos días!"   

regex demo


数据:

x <- "this is a speech text. FIRST PERSON: hi all, thank you for coming. SECOND PERSON: thank you for inviting us. TERCER PERSONA QUE SE LLAMA ANDRÉS: soy de: acuerdo. CUARTA PERSONA (JOHN): Hi. How are you? ANDRÉS: Hola buenos días!"