正则表达式使用R中的正则表达式序列清除数据

时间:2017-03-09 03:13:55

标签: r regex

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

[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   本体   属性 映射   三元组 存储    "

某些英文单词在每个字符(例如第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之间有空格”。在这些词中,有两个以上的空间。 现在我正在尝试将这些英语单词中的空格删除为结果:“Wiki”,“SemanticMediaWiki”,“PAUX”,“IkeWiki”以及像以前一样保留其他词语。 我之前使用过“gsub”:“kwdict<-gsub("^[[:alpha:][:blank:]]+", "\\w", kwdict)”。但无论我使用“\ w”还是“[[:alpha:]]”,结果都是错误的,所有的单词都被改变了。 我们如何准确地选择这些英文单词并删除其中的空格?

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

我多次使用R分别用以下句子

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?

正确定义这种模式

2 个答案:

答案 0 :(得分:1)

感谢 @赵鸿丰 @waterling

的一些评论

我想我能找到你问题的根源,问题是那些你认为是英文字母的单词,它们本质上不是ascii。它们实际上是拉丁文大写和小写的英文字母。但是,有些字母是英文字母(“Solar”和“Liferay”)。

运行以下命令将其转换为UTF-8(您可能不需要这样做,我很高兴看到UTF-8格式的东西,并且谷歌在UTF-8方面给我带来了更好的结果)

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值。我在互联网上搜索了这些价值所转化的内容。我偶然发现了 this网站。这些帮助我理解了与之相关的UTF-8值。

所以我写了一个小的正则表达式来解决你的问题,我使用了stringr库。您可以选择任何库/ BASE R gsub 来解决您的问题。

value <- str_replace_all(string,'(?<=[\U{FF41}-\U{FF5A}]|[\U{FF21}-\U{FF3A}])\\s*',"")

要理解正则表达式:

字符类(用方括号表示)包含UTF范围的大写和小写LATIN大写字母(我在上面提到的站点中找到)。我把它们放入正则表达式的外观断言以及表示空格的\ s。我已经匹配了空格,然后没有替换它们。这样,我的结果如下所示。我希望这是你所期待的。此外,由于您无法在控制台上看到此内容,因此您可以使用str_view_all函数在翻译成html时查看这些字母。我只复制并粘贴了结果。

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

我希望这能够详细解释您的问题。谢谢!!!

在OP的评论之后,似乎他想将宽拉丁语英语表格替换为普通字母,外部文件用于替换unicode,此文件(NamesList.txt)可以在< strong>此link

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="")

<强>结果:

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

CAVEAT :以上代码与MACOSX Sierra和R-3.3配合使用,但在Windows上,自动在R studio控制台上所有内容都转换为相应的英文文本,我无法看到UTF -8代码反对这些文本。我无法确定原因。

修改

我最近发现stri_trans_general库中有一个名为stringi的函数可以非常有效地完成此任务,一旦使用正则表达式删除空格,如上所述,我们可以直接翻译拉丁语使用以下代码的宽字母:

dt <- c('SemanticMediaWikiPAUXIkeWiki')

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

答案与上面提到的相同。

答案 1 :(得分:0)

你可以用两个正则表达式来解决这个问题,首先用以下方法消除单词之间的单个空格

s/(\a)\s{1}/\1/g

然后用单个空格替换单词之间的2个或更多空格:

s/\s{2,}/ /g

将这两个正则表达式应用于以下文本:

T h i s   i s  a   t e s t  c a s e  f o r   m y   r e g e x
W o r d s  c a n     b e    a r b i t r a r i l y   s p a c e d

给出:

This is a test case for my regex
Words can be arbitrarily spaced