首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正则表达式数据清除--在R中使用regex序列

正则表达式数据清除--在R中使用regex序列
EN

Stack Overflow用户
提问于 2017-03-09 03:13:55
回答 1查看 205关注 0票数 5

关键字列表中包含汉字和英文单词,如下所示:

代码语言:javascript
复制
[1] "    服务 接口   知识 组织   开放 查询   语义 推理   Web   服务 "                                                                        
[2] "    Solr   分面 搜索   标准 信息管理 "  
[3] "  语义   W i k i   标注   导航   检索   S e m a n t i c M e d i a W i k i   P A U X   I k e W i k i    "
[4] "  Liferay   主从 模式   集成 知识 平台    " 
[5] "    数据 摄取   SKE   本体   属性 映射   三元组 存储    "

有些英语单词在每个字符(如第三行)、“W i k i”、“S e m a n t i c M e d i a W i k i”、“P A U X”、“I k e W i k i”之间都有空格。在这些词中,有两个以上的空间。现在我试着删除这些英文单词中的空格到结果:“Wiki”,“SemanticMediaWiki”,“PAUX”,“IkeWiki”,还有其他像以前一样的单词。我以前用过“gsub”这个词:“kwdict<-gsub("^[[:alpha:][:blank:]]+", "\\w", kwdict)”。但是无论我使用"\w“还是”[:alpha:]“,结果都是错误的,所有的单词都被更改了。我们如何准确地选择这些英语单词并删除其中的空格?

代码语言:javascript
复制
[1] "    服务 接口   知识 组织   开放 查询   语义 推理   Web   服务 "                                                                        
[2] "    Solr   分面 搜索   标准 信息管理 "                                                                            [3] "  语义   Wiki   标注   导航   检索   SemanticMediaWiki   PAUX   IkeWiki    "
[4] "  Liferay   主从 模式   集成 知识 平台    "                                                                         [5] "    数据 摄取   SKE   本体   属性 映射   三元组 存储    "

我试了很多次,用R和下面的句子分开

代码语言:javascript
复制
kwdict<-gsub("[[:alpha:]/[:space:]{1}]", "", kwdict)
kwdict<-gsub("[^[:alpha:]_[:space:]]{1}", "", kwdict)
kwdict<-gsub("[^[:alpha:][:space:]]{1}", "", kwdict)
kwdict<-gsub("[^[:alpha:][:space:]{1}^[:alpha:]]", "", kwdict)
kwdict<-gsub("[//>[:space:]{1}]", "", kwdict)
kwdict<-gsub("[[:alpha:][:space:]{1}]", "", kwdict)

但是它什么也没做,删除了所有的空格,甚至清除了所有的单词!我认为这是因为模式包括“:alpha:”我们用来定位空格字符的起始标记。有任何想法来正确定义这个模式使用R吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-14 14:06:46

感谢@赵鸿丰@waterling的一些评论

我想我能找到你问题的根源,问题是那些你认为是英语字母的单词--它们在nature.They中不是ascii --实际上是英文字母的拉丁文大小写。然而,有些字母是英文的(“太阳”和"Liferay")。

运行下面的命令将此转换为UTF-8 (您可能不需要这样做,我很乐意看到UTF-8格式的东西,而且做google也没有给我更好的UTF-8)。

代码语言:javascript
复制
string <- c("    服务 接口   知识 组织   开放 查询   语义 推理   Web   服务 ",      
             "    Solr   分面 搜索   标准 信息管理 "  ,
             "  语义   W i k i   标注   导航   检索   S e m a n t i c M e d i a W i k i   P A U X   I k e W i k i    ",
             "  Liferay   主从 模式   集成 知识 平台    " ,
             "    数据 摄取   SKE   本体   属性 映射   三元组 存储    ")

Encoding(string) <- "UTF-8"

运行上面的命令之后,就会看到带有这些字符的UTF-8值。我在互联网上搜索了这些价值转化为什么。我偶然发现了 site。这些帮助我理解与之相关的UTF-8值。

所以我编写了小regex来解决您的问题,我使用了stringr库。您可以选择任何库/库R gsub来解决您的问题。

代码语言:javascript
复制
value <- str_replace_all(string,'(?<=[\U{FF41}-\U{FF5A}]|[\U{FF21}-\U{FF3A}])\\s*',"")

要理解正则表达式:

字符类(用方括号表示)包含大写字母和小写字母的UTF范围(我在上面提到的站点中找到了这些字母)。我将它们与\s一起放入regex查找断言中,它表示空格。我已经匹配了空间,然后什么也没有替换。这样的话,我得到的结果如下所示。我希望这是你所期望的。另外,由于您无法在控制台上看到这一点,所以在翻译成html时,可以使用str_view_all函数来查看这些字母。我只是复制和粘贴了结果。

代码语言:javascript
复制
服务 接口 知识 组织 开放 查询 语义 推理 Web 服务
Solr 分面 搜索 标准 信息管理
语义 Wiki标注 导航 检索 SemanticMediaWikiPAUXIkeWiki
Liferay 主从 模式 集成 知识 平台
数据 摄取 SKE 本体 属性 映射 三元组 存储

我希望这能详细解释你的问题的解决办法。谢谢!

在OP的注释之后,他似乎想用普通字母替换宽的拉丁文格式,一个外部文件用于替换unicode,这个文件(NamesList.txt)可以在 this 链接找到。

代码语言:javascript
复制
library(stringr)
library(Unicode) ##Unicode is a beautiful library having lot of great functions such as u_char_from_name which is used here.
rd_dt <- readLines("NamesList.txt",encoding="UTF-8")

  ##cleaning of Nameslist.txt which has unicode values against wide latin alphabet
rd_dt1 <- rd_dt[grep("[[:alnum:]]{4}\t.*",rd_dt)]

rd_dt1 <- read.delim(textConnection(rd_dt1),sep="\t",stringsAsFactors = F)
rd_dt1 <- rd_dt1[,1:2]
names(rd_dt1) <- c("UTF_8_values","Symbol")
rd_dt1 <- rd_dt1[grep("LATIN",rd_dt1$Symbol),]
rd_dt1 <- rd_dt1[grep("WIDTH",rd_dt1$Symbol),]
value <- substr(rd_dt1$Symbol,nchar(trimws(rd_dt1$Symbol)),nchar(trimws(rd_dt1$Symbol)))
rd_dt1$value <- value
###Assigning captial and small english letter to their corresponding latin wide small and captial letters
letters <-  grepl("CAPITAL",rd_dt1$Symbol)+0
captial_small <- ifelse(letters==1,toupper(rd_dt1$value),tolower(rd_dt1$value))
rd_dt1$capital_small <- captial_small
rd_dt1 <- rd_dt1[,c(1,2,4)]
### From OP's source taking the text which is non english and it is wide latin text
dt <- c('SemanticMediaWikiPAUXIkeWiki')
###Check of the contents between UTF values of OP's text content and the UTF-8 text files
as.u_char(utf8ToInt(dt)) %in% u_char_from_name(rd_dt1$Symbol)

转换的最后答案:

paste0(rd_dt1[match(utf8ToInt(dt),u_char_from_name(rd_dt1$Symbol)),"capital_small"],collapse="")

结果:

代码语言:javascript
复制
> paste0(rd_dt1[match(utf8ToInt(dt),u_char_from_name(rd_dt1$Symbol)),"capital_small"],collapse="")
[1] "SemanticMediaWikiPAUXIkeWiki"

警告:上面的代码与MacOSX塞拉利昂和R-3.3很好地工作,然而在windows上,在R工作室控制台自动转换成相应的英文文本,我无法看到针对这些文本的UTF-8代码。我无法确定原因。

编辑

我最近发现,在stri_trans_general库中有一个名为stringi的函数,它可以高效地完成这项任务,一旦使用regex删除了空格,我们就可以使用下面的代码直接翻译拉丁语宽字母表:

代码语言:javascript
复制
dt <- c('SemanticMediaWikiPAUXIkeWiki')

stringi::stri_trans_general(dt, "latin-ascii")

答案与上文所述相同。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42685988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档