r - 如何从文本中折叠具有特定模式的某些字符串?
问题描述
我有一些文本字符串(实际文本下面的示例是一整本书)。如您所见,每个字符串都以句号或问号分隔。
[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)
解决方案
一种方法是使用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."
推荐阅读
- postgresql - SequelizeJS:执行 INSERT 原始查询时如何知道成功或失败?
- polymer - Polymer google-map 组件控件似乎搞砸了
- vis.js-timeline - vis.js 时间轴视图中按时间顺序排列的项目集
- ruby-on-rails - Bundler 找不到 gem "jwt" 的兼容版本
- dialogflow-es - 对话流会话的生命周期是多少?
- sql-server - 在哪里可以找到 Adventureworks2012_database.zip?
- python - RNN 模型不是在学习。图中所附的预测值和实际值是一条平线
- python - Python Pandas ValueError : Series 的真值不明确
- mongodb - mongodb创建索引并将字符串转换为数字
- node.js - React-Native 无法连接到 Node.js 服务器(网络请求失败 onerror)