首页 > 解决方案 > 如何从文本中折叠具有特定模式的某些字符串?

问题描述

我有一些文本字符串(实际文本下面的示例是一整本书)。如您所见,每个字符串都以句号或问号分隔。

   [1]"I am a Mr."
   [2]"asking for help."
   [3]"Can you help?"
   [4]"Thank you ms."
   [5]"or mr."

我想在字符串以诸如先生、夫人之类的缩写结尾的地方折叠。所以最终结果将是下面的所需输出。

    [1]"I am a Mr. asking for help."
    [2]"Can you help?"
    [3]"Thank you ms. or mr."

我已经创建了一个向量(称为 abbr),其中包含以下格式的所有缩写:

> abbr
[1] "Mr|Mrs|Ms|Dr|Ave|Blvd|Rd|Mt|Capt|Maj"

但我不知道如何在粘贴功能中使用它来折叠。我还尝试使用 gsub (不起作用)将 \n 以下缩写替换为带有如下空格的句点:

lines<-gsub('(?<=abbr\\.\\n)(?=[A-Z])', ' ', lines, perl=FALSE)

标签: r

解决方案


一种方法是使用strsplit以下逻辑 * 在空白处拆分 * 标点符号前面的空格 * 标点符号前面没有缩写向量

我将字符串放入 1 个字符向量中,如下所示:

lines2 <- paste(lines, collapse = ' ')
lines2
[1] "I am a Mr. asking for help. Can you help? Thank you ms. or mr."

下面是如何使用正则表达式来实现这一点。重要的是,您尝试在引号中使用“abbr”,但无法找到您定义的向量,您必须将其包含在paste. 我还在abbr. 我包括了几行来构建这些想法。我使用look-behinds,你可以在这里了解更多

# Split on punctuation
strsplit(lines2, "[[:punct:]]", perl = T)

# Split on punctuation, not preceded by abbr
strsplit(lines2, paste("(?<!",abbr,")[[:punct:]]"), perl = T)

# Split on space after punctuation, not preceded by abbr
strsplit(lines2, paste("(?<=(?<!", abbr,")[[:punct:]])[[:space:]]"), perl = T)

[[1]]
[1] "I am a Mr. asking for help." "Can you help?"              
[3] "Thank you ms. or mr." 

推荐阅读