删除标点符号但保留表情符号?

2023-11-22

是否可以删除所有标点符号但保留表情符号,例如

:-(

:)

:D

:p

structure(list(text = structure(c(4L, 6L, 1L, 2L, 5L, 3L), .Label =     c("ãããæããããéãããæãããInappropriate announce:-(", 
"@AirAsia your direct debit (Maybank) payment gateways is not working. Is it something     you are working to fix?", 
"@AirAsia Apart from the slight delay and shortage of food on our way back from Phuket, both flights were very smooth. Kudos :)", 
"RT @AirAsia: ØØÙØÙÙÙÙ ÙØØØ ØØØÙ ÙØØØØÙ ØØØØÙÙÙí í Now you can enjoy a #great :D breakfast onboard with our new breakfast meals! :D", 
"xdek ke flight @AirAsia Malaysia to LA... hahah..:p bagi la promo murah2 sikit, kompom aku beli...", 
"You know there is a problem when customer service asks you to wait for 103 minutes and your no is 42 in the queue. X-("
), class = "factor"), created = structure(c(5L, 4L, 4L, 3L, 2L, 
1L), .Label = c("1/2/2014 16:14", "1/2/2014 17:00", "3/2/2014 0:54", 
"3/2/2014 0:58", "3/2/2014 1:28"), class = "factor")), .Names = c("text", 
"created"), class = "data.frame", row.names = c(NA, -6L))

1. 一个有效的纯正则表达式解决方案(又名 Edit#2)

这个任务can做完了purely使用正则表达式(非常感谢@Mike Samuel)

首先我们建立一个表情符号数据库:

(emots <- as.character(outer(c(":", ";", ":-", ";-"),
+                c(")", "(", "]", "[", "D", "o", "O", "P", "p"), stri_paste)))
## [1] ":)"  ";)"  ":-)" ";-)" ":("  ";("  ":-(" ";-(" ":]"  ";]"  ":-]" ";-]" ":["  ";["  ":-[" ";-[" ":D"  ";D"  ":-D" ";-D"
## [21] ":o"  ";o"  ":-o" ";-o" ":O"  ";O"  ":-O" ";-O" ":P"  ";P"  ":-P" ";-P" ":p"  ";p"  ":-p" ";-p"

示例性输入文本:

text <- ":) ;P :] :) ;D :( LOL :) I've been to... the (grocery) st{o}re :P :-) --- and the salesperson said: Oh boy!"

一个辅助函数,它转义一些特殊字符,以便它们可以在正则表达式模式中使用(使用stringi包裹):

library(stringi)
escape_regex <- function(r) {
   stri_replace_all_regex(r, "\\(|\\)|\\[|\\]", "\\\\$0")
}

匹配表情符号的正则表达式:

(regex1 <- stri_c("(", stri_c(escape_regex(emots), collapse="|"), ")"))
## [1] "(:\\)|;\\)|:-\\)|;-\\)|:\\(|;\\(|:-\\(|;-\\(|:\\]|;\\]|:-\\]|;-\\]|:\\[|;\\[|:-\\[|;-\\[|:D|;D|:-D|;-D|:o|;o|:-o|;-o|:O|;O|:-O|;-O|:P|;P|:-P|;-P|:p|;p|:-p|;-p)"

现在,正如@Mike Samuel 在下面建议的那样,我们只需匹配(emoticon)|punctuation(注意表情符号在捕获组中)然后替换匹配项 捕获组 1 的结果(所以如果它是表情符号,我们有 replacement=这个表情符号,如果是标点符号,我们有 replacement=nothing)。这会起作用,因为与|在 ICU Regex 中(这是用于stri_replace_all_regex) is 贪婪和左偏:表情符号将先于标点符号进行匹配。

stri_replace_all_regex(text, stri_c(regex1, "|\\p{P}"), "$1")
## [1] ":) ;P :] :) ;D :( LOL :) Ive been to the grocery store :P :-)  and the salesperson said Oh boy"

顺便说一句,如果您只想删除选定的一组字符,请输入例如[.,]代替[\\p{P}] above.

2.正则表达式解决方案提示 - 我的第一次(不明智的)尝试(又名原始答案)

我的第一个想法(主要出于“历史原因”而留在这里)是通过使用来解决这个问题前瞻和后瞻,但是 - 正如您所看到的 - 这远非完美。

删除所有: and ;没有跟随), (, D, X, 8, [, or ]使用负向后看:

stri_replace_all_regex(text, "[:;](?![)P(DX8\\[\\]])", "")
## [1] ":) :8 ;P :] :) ;D :( LOL :) I've been to... the grocery store :P -) --- and the salesperson said Oh boy!"

现在我们可以添加一些老式的表情符号(带有鼻子,例如:-), ;-D etc.)

stri_replace_all_regex(text, "[:;](?![-]?[)P(DX8\\[\\]])", "")
## [1] ":) :8 ;P :] :) ;D :( LOL :) I've been to... the grocery store :P :-) --- and the salesperson said Oh boy!"

现在删除连字符(否定向后看并向前看)

stri_replace_all_regex(text, "[:;](?![-]?[)P(DX8\\[\\]])|(?!<[:;])[-](?![)P(DX8\\[\\]])", "")
## [1] ":) :8 ;P :] :) ;D :( LOL :) I've been to... the grocery store :P :-)  and the salesperson said Oh boy!"

等等。当然,首先您应该建立自己的表情符号(保留原样)和标点符号(删除)数据库。正则表达式将高度依赖于这两组,因此很难添加新的表情符号——它绝对不值得应用(并且可能会扭曲你的大脑)。

3.第二次尝试(正则表达式-哑巴友好,又名Edit#1)

另一方面,如果您对复杂的正则表达式过敏,请尝试这个。这种方法有一些“说教的好处”——我们对以下每个步骤中所做的事情有充分的了解:

  1. 找到其中的所有表情符号text;
  2. 找到其中的所有标点符号text;
  3. 查找不属于表情符号的标点符号的位置;
  4. 删除步骤 3 中的字符。

示例性输入文本 - 仅 1 个字符串 - 留下通用案例作为练习;)

text <- ":) ;P :] :) ;D :( LOL :) I've been to... the (grocery) st{o}re :P :-) --- and the salesperson said: Oh boy!"

一个辅助函数,用于转义一些特殊字符,以便它们可以在正则表达式中使用:

escape_regex <- function(r) {
   library("stringi")
   stri_replace_all_regex(r, "\\(|\\)|\\[|\\]", "\\\\$0")
}

匹配表情符号的正则表达式:

(regex1 <- stri_c("(", stri_c(escape_regex(emots), collapse="|"), ")"))
## [1] "(:\\)|;\\)|:-\\)|;-\\)|:\\(|;\\(|:-\\(|;-\\(|:\\]|;\\]|:-\\]|;-\\]|:\\[|;\\[|:-\\[|;-\\[|:D|;D|:-D|;-D|:o|;o|:-o|;-o|:O|;O|:-O|;-O|:P|;P|:-P|;-P|:p|;p|:-p|;-p)"

找到所有表情符号的开始和结束位置(即找到第一个表情符号)OR第二OR...表情符号):

where_emots <- stri_locate_all_regex(text, regex1)[[1]] # only for the first string of text
print(where_emots)
##       start end
##  [1,]     1   2
##  [2,]     4   5
##  [3,]     7   8
##  [4,]    10  11
##  [5,]    13  14
##  [6,]    16  17
##  [7,]    23  24
##  [8,]    64  65
##  [9,]    67  69

找到所有标点符号(此处\\p{P} is the Unicode 字符类代表标点符号):

where_punct <- stri_locate_all_regex(text, "\\p{P}")[[1]]
print(where_punct)
##       start end
##  [1,]     1   1
##  [2,]     2   2
##  [3,]     4   4
##  [4,]     7   7
##  [5,]     8   8
## ...
## [26,]    72  72
## [27,]    73  73
## [28,]    99  99
## [29,]   107 107

由于表情符号中出现了一些标点符号,我们不应该将它们暂存以进行删除:

which_punct_omit <- sapply(1:nrow(where_punct), function(i) {
   any(where_punct[i,1] >= where_emots[,1] &
        where_punct[i,2] <= where_emots[,2]) })
where_punct <- where_punct[!which_punct_omit,] # update where_punct
print(where_punct)
##       start end
##  [1,]    27  27
##  [2,]    38  38
##  [3,]    39  39
##  [4,]    40  40
##  [5,]    46  46
##  [6,]    54  54
##  [7,]    58  58
##  [8,]    60  60
##  [9,]    71  71
## [10,]    72  72
## [11,]    73  73
## [12,]    99  99
## [13,]   107 107

每个标点符号肯定只包含 1 个字符,因此总是where_punct[,1]==where_punct[,2].

现在是最后一部分。如你所见,where_punct[,1]包含要删除的字符的位置。恕我直言,最简单的方法(没有循环)是将字符串转换为 UTF-32(每个字符 == 1 个整数),删除不需要的元素,然后返回到文本表示:

text_tmp <- stri_enc_toutf32(text)[[1]]
print(text_tmp) # here - just ASCII codes...
## [1]  58  41  32  59  80  32  58  93  32  58....
text_tmp <- text_tmp[-where_punct[,1]] # removal, but be sure that where_punct is not empty!

结果是:

stri_enc_fromutf32(text_tmp)
## [1] ":) ;P :] :) ;D :( LOL :) Ive been to the grocery store :P :-)  and the salesperson said Oh boy"

给你。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

删除标点符号但保留表情符号? 的相关文章

  • 在开发模式下安装包(R源未编译成Rdb)

    我需要修改R代码在一个R具有 Fortran 绑定的包 当我安装软件包时 我看到存储库目录没有源代码 但是 Rdb而是二进制文件 我看了看devtools包 但我仍然不清楚如何在不编译 R 源部分的情况下安装该包 类似于 python py
  • 如何找到每个分类变量的连续变量的平均值

    我想在 y 轴上绘制连续的 BMI 在 x 轴上绘制家庭收入的分类变量 并且我希望该图绘制每个类别的平均 BMI 然而 我不知道如何找到家庭收入每个因素的平均体重指数 Dataset nh 5994 total IDs with Obser
  • 在r包中重新导出数据集

    In R包 有可能重新导出函数 这使得很容易回收相同的函数 而不必在不同的包之间重复代码 例如 devtools session info函数是重新导出sessioninfo session info export importFrom s
  • 尝试通过列表递归时,在 R 中出现错误“递归索引在级别 2 失败”

    当我尝试递归遍历图形顶点列表 将它们的值与列表中的一组颜色进行匹配时 出现错误 递归索引在级别 2 失败 我的颜色列表如下 colrs lt list l blue c red n gray50 然后我有一个 igraph 中的顶点列表vs
  • 如何在 R 中执行随机森林/交叉验证

    我无法找到对我尝试生成的回归随机森林模型执行交叉验证的方法 因此 我有一个数据集 其中包含 1664 个解释变量 不同的化学性质 和一个响应变量 保留时间 我正在尝试生成一个回归随机森林模型 以便能够预测给定保留时间的物质的化学性质 ID
  • 使用 R 迭代读取、操作多个 Excel 文件并将它们附加到一个数据帧中

    在一个目录下 我有多个具有相似格式的excel文件 您可以从以下位置下载示例文件 here https www dropbox com s ho3visres55kpoy test zip dl 0 我需要 循环文件和read excel
  • 从 foreach 循环赋值

    我想并行化一个循环 例如 td lt data frame cbind c rep 1 4 2 rep 1 5 rep 1 10 2 names td lt c val id res lt rep NA NROW td for i in l
  • Pygame 文本不渲染

    好的 我正在用 python 和 pygame 制作一个多项选择测验游戏 不过 我已经完成了开始屏幕并尝试制作问题屏幕 我根本不明白为什么文本不呈现 这是我的代码 enter pressed False random question ra
  • 在 R 中将文本文件拆分为段落文件

    我正在尝试将一个巨大的 text 文件拆分为多个 text 文件 每个文件仅包含一个段落 让我举个例子 我需要这样的文字 这是第一段 这没有任何意义 因为这只是一个例子 这是第二段 和前一段一样毫无意义 另存为两个独立的 txt 文件 其中
  • 如何将运算符作为分隔符拆分数学表达式,同时将它们保留在结果中?

    我需要拆分一个表达式 例如 a b c d e and get a b c d e分别 作为字符串数组 以及 d 也是一个运算符数组 分别 我尝试过 String myString String myString a b c d e Str
  • 在knitr中打印漂亮的交叉表

    我想要的是使用 R Markdown 和 knit 从 RStudio 打印漂亮的交叉表 无论是在 pdf 文件中 还是在 html 文件中 我怀疑我错过了一些非常明显的东西 因为我不敢相信这是如此困难 我使用 xtabs 或 ftable
  • 完全缺失列的 VaR 计算

    我需要计算股票收益的滚动 VaR 从这篇文章 使用rollapply函数使用R进行VaR计算 https stackoverflow com questions 25045612 using rollapply function for v
  • 从 Cox PH 模型预测概率

    我正在尝试使用 cox 模型来预测时间 称为停止 3 后失败的概率 bladder1 lt bladder bladder enum lt 5 coxmodel coxph Surv stop event rx size number cl
  • 在R中绘制3x3方形网格

    我得到了一个数字列表 n 9 想将它们画在一个 3 3 的正方形网格中 每个网格填充相应的数字 我如何在 R 中执行此操作而不安装额外的软件包 例如情节 非常感谢 这里有一个ggplot解决方案比我预期的要难一点 Setup the dat
  • 如何从类外部更改公共 R6 类方法?

    我希望能够在我的 R6 类中重新定义公共方法 以便它根据该类保存的数据类型进行更改 如下所示 library R6 Simple lt R6Class Simple public list dt mtcars my print functi
  • 检查 href 中是否存在 jQuery 中的查询字符串

    我目前有一段 jQuery 用于附加带有一些位置信息的 URL jQuery a attr href function return this href location 123 abc 我的问题是大多数链接都有一个 其中使用上面的 就可以
  • Rglpk - 梦幻足球阵容优化器 - For 循环输出的 Rbind

    我有一个使用 Rgplk 的梦幻足球阵容优化器 它使用for循环生成多个最佳阵容 其数量由用户输入 代码如下 Lineups lt list for i in 1 Lineup no matrix lt rbind as numeric D
  • 如何更改 Quarto pptx 中的字体格式

    我正在 R 中使用 Quarto 创建 pptx 要更改我尝试更改的默认字体格式mainfont范围 但是当我渲染它时 最终的 pptx 文件具有默认字体 Calibri 这是我的文件 YAML 将 Quarto 文件渲染为 pptx 时如
  • 在多面图中用 N 注释 x 轴

    我正在尝试生成一些按治疗条件和访问次数细分的数字结果的箱线图 每个框中的观察次数都放在图下方 并且也标记了访问次数 这里有一些虚假数据可以用来说明 我举了两个我尝试过但不太有效的例子 library ggplot2 library plyr
  • 为 ggplot 定义新的尺度轴变换

    我正在尝试创建一个squared使用 y 轴变换scales trans new但遇到错误 MWE data data frame x 1 10 y runif 10 z rnorm 10 10 library ggplot2 ggplot

随机推荐

  • Spring-Security:升级到 Spring-Security 4.1 后,登录时用户名发送为空

    我正在开发一个基于 Spring MVC 的应用程序 其中我们使用 Spring Security 进行登录 授权 我们之前使用的是3 2 5版本 升级为4 1 1 但升级后 登录机制被破坏 因为发送的用户名为空 我不知道出了什么问题 你能
  • 放置新的以推迟到不同的构造函数

    这安全吗 我在实际实现中没有使用任何虚拟函数 但我很想相信即使我使用了 它仍然是安全的 class Foo Foo initialize things Foo int new this Foo 当您输入左大括号时Foo int 构造函数 所
  • 什么是 GIT_WORK_TREE,为什么我从来不需要设置这个 ENV var,为什么现在呢?

    我在 Ubuntu Linux 下使用 Git 来同步和部署我的项目 我的本地 Linux 工作机上有一个存储库 服务器上有两个存储库 一个是裸存储库 另一个是已部署的应用程序 它总是工作正常 但现在我为我的其他网站创建了另一个存储库 我收
  • 在 WebBrowser 控件中设置输入标记的值

    我正在尝试帮助用户使用自定义登录他们的帐户WebBrowser控制 我正在尝试使用以下命令将输入 标签的值设置为玩家用户名WebBrowser s InvokeScript功能 但是 我当前的解决方案只是渲染一个空白的白页 我当前的代码如下
  • 重写mysql select以减少时间并将tmp写入磁盘

    我有一个 mysql 查询 需要几分钟的时间 这不是很好 因为它用于创建网页 使用三个表 海报数据包含有关各个海报的信息 poster categories 列出了所有类别 电影 艺术等 而 poster prodcat 则列出了 post
  • 如何修复 org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl@779de014 已关闭问题

    我正在尝试使用 Hibernate 5 创建或更新用户 它抛出以下异常 org hibernate resource jdbc internal LogicalConnectionManagedImpl 779de014 已关闭 我正在使用
  • C++11“不可移动”类型[重复]

    这个问题在这里已经有答案了 可能的重复 为什么 C 11 删除的函数参与重载决策 我对以下 C 11 代码有两个问题 include
  • Java 小程序和网页上的文本输入控件之间的桥梁

    我一直在使用一个Java小程序 它是一个可以帮助仅使用鼠标进行编写的小程序 就我而言 我尝试将其合并到我的网站项目中 如下所示 当用户单击页面上的任何输入元素 文本框 文本区域 时 此 JAVA 小程序会加载到网页本身上 在下面看到的 JA
  • Asp.Net MVC 4 API:在 IE8 中下载 docx 失败

    我将文档存储在数据库中 并有一个用于下载文档的 api 下载docx和xlsx在IE9 Chrome和FF中工作正常 但在真正的IE8中失败 IE8模式下的IE 9也可以 我收到的错误消息如下 无法从idler2 下载393 无法打开此 I
  • Python算法计算csv中特定单词的出现次数

    我刚刚开始学习Python 我很好奇什么是计算 CSV 文件中特定单词出现次数的有效方法 而不是简单地使用 for 循环逐行遍历并读取 更具体地说 假设我有一个 CSV 文件 其中包含两列 姓名 和 成绩 包含数百万条记录 如何计算 Gra
  • 无法获取透明DialogFragment

    我有一个看起来像这样的对话框片段 AlertDialog ad builder create Drawable d new ColorDrawable Color BLACK d setAlpha 130 ad getWindow setB
  • 在 Android 教程应用程序上使图像全屏显示

    使用 Hello World Gridview 教程示例 我尝试使图像在单击时全屏显示 而不是显示图像在数组中的位置 由于我对Android不熟悉 而且这是我第一次尝试用它进行开发 所以我很茫然 我对 Java 很熟悉 并且我尝试过这样做
  • Oracle SQL:从带有嵌套表的表中选择

    我想知道如何从具有类型列的表中创建 select 语句 该列的类型定义为 create or replace TYPE MYCOL as table of MYTYPE create or replace TYPE MYTYPE as OB
  • css-sprite 是一种好技术吗? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 css sprite 是个好技术吗 我在以下位置阅读了有关其优点的信息http spriteme org 我还在 stackoverflow 中看到了很多关于 css sprites 的问
  • 将 Intellij-Idea UI 表单导出到 Eclipse

    我有一个 Java 项目要做 所以我决定使用Inltellij Idea中的Designer来帮助我快速完成表单和窗口 并有更多的时间来开发应用程序 我面临的问题是老师使用 Eclipse 所以我认为在开发结束时我可以导出我的 Intell
  • LDAP 问题,ldap_bind 无效 dn 语法

    我知道我的错误非常简单 但我试图找到问题所在 但我没有看到它 也许你可以帮助我 我正在尝试使用 php 创建一个函数 这样我就可以连接到 LDAP 并找到所需的信息 我的 php 代码如下 ldapconfig host 127 0 0 1
  • 如何根据访问者的位置显示本地时间?

    我们正在开发一个网站 供世界各地的人们使用 网站中有一个聊天部分 我们希望消息显示带有时间戳 我在数据库中存储每条消息的时间戳 根据访问者当地时间 向访问者显示每条消息的正确时间的方法是什么 我不想询问用户他的时区 有没有办法只使用 PHP
  • 如何在 SQL Server 2005 中存储时区

    我正在构建一个网络应用程序 用户可以在其中输入事件 包括 活动标题 开始日期 时间 描述 用户想要输入开始日期 时间 包括与事件位置相对应的时区 这些活动是全球性的 因此时区可能会因活动而异 在SQL Server后端数据库中 我使用dat
  • 如何在 python 中抑制控制台/cmd 错误消息

    如何抑制 python 中 chromedriver 和 pyinstaller exe 的错误消息 我注意到 当我在 pyinstaller 中使用 chromedriver 并运行它时 我会收到错误消息列表 我一直在尝试删除它们 但到目
  • 删除标点符号但保留表情符号?

    是否可以删除所有标点符号但保留表情符号 例如 D p structure list text structure c 4L 6L 1L 2L 5L 3L Label c Inappropriate announce AirAsia your