2017-03-08 67 views
1

我有一个要求,我正在处理韩文文本中具有双字节字符的大数据。我想寻找一个角色并取代它。为了在浏览器中正确显示韩文文本,我改变了R中的语言环境设置。但不知道它是否更新了代码。下面是我的代码来改变区域韩国和朝鲜文字变得可见正确的阅读器,但在控制台它提供了有关印刷 -R utf-8并从基于结尾字符的句子中替换单词

垃圾字符

Sys.setlocale(category = "LC_ALL", locale = "korean")

我的数据是包含一个data.table格式与文本在韩国的列。例如 -

“광주광역시동구제봉로49(남동,(지하))”

我想摆脱的第一个字与 “시” 字符结尾的。然后我想摆脱“(남동,(지하))”的结局。我正在尝试gsub,但它似乎没有工作。

New <- c("광주광역시 동구 제봉로 49 (남동,(지하))")

data <- as.data.table(New)

data[,New_trunc := gsub("\\b시", "", data$New)]

请让我知道我错了。因为我想搜索单词的结尾,所以我使用\\ b,并且因为我想替换以“시”字符结尾的任何单词,我将它作为\\ b시.....这是不是给?如何照顾()在句尾。

什么将是一个很好的来源参考正则表达式。

脚本还需要utf-8设置吗?怎么做?

+0

所以,你想从字的*结尾*中删除该字符?你需要使用'gsub(“시\\ b”,“”,New)' –

+0

你不想清楚你想在字符串末尾去掉什么:一个空格跟着'(',然后是0+字符除了空格,最后的字符应该是')'?或嵌套'(...(..(。)。)..)'?试试'gsub(“시\\ b | \\ s + \\(+ \\ S * \\)+ $”,“”,New)'。 –

+0

尝试'gsub(“시\\ b | \\ s + \\(+ \\ S * \\)+ $”,“”,New)' –

回答

1

既然你需要匹配你在这个词的年底信,您需要将\b(字边界)后面的字母,从而要求从一个字母到非过渡那封信后的字母(或字符串的结尾)。将处理这方面的一个PCRE模式是

"\\s*\\b\\p{L}*시\\b" 

详细

  • \\s* - 零个或多个空格
  • \\b - 领先字边界
  • \\p{L}* - 零个或多个字母
  • - 您的特定信件
  • \\b - 字

第二个问题的到底是什么人,你需要在字符串的结尾中移除一组嵌套的括号。你需要再次依靠PCRE正则表达式(perl=TRUE),它可以在子程序调用的帮助下处理递归。

> sub("\\s*(\\((?:[^()]++|(?1))*\\))$", "", New, perl=TRUE) 
[1] "광주광역시 동구 제봉로 49" 

详细

  • \\s* - 零个或多个空格
  • (\\((?:[^()]++|(?1))*\\)) - 第1组(将被递归)匹配
    • \\( - 字面(
    • (?:[^()]++|(?1))* - 零个或多个
      • [^()]++的 - 比()(占有性)其它1个或多个字符
      • | - 或
      • (?1) - 子程序调用,重复整个第1点的子模式
    • \\) - 一个字面)
  • $ - 字符串结尾。

现在,如果您需要将两者结合使用,您会发现R PCRE-powered gsub不能轻松处理模式中的Unicode字符。你必须告诉它使用带有(*UCP) PCRE动词的Unicode模式。

> gsub("(*UCP)\\b\\p{L}*시\\b|\\s*(\\((?:[^()]++|(?1))*\\))$", "", New, perl=TRUE) 
[1] " 동구 제봉로 49" 

或者用trimws摆脱前/后的空白:

> trimws(gsub("(*UCP)\\b\\p{L}*시\\b|(\\((?:[^()]++|(?1))*\\))$", "", New, perl=TRUE)) 
[1] "동구 제봉로 49" 

查看关于在PCRE Man page动词的更多细节。

+0

非常感谢!这解决了我的问题。我想快速聊天?你有一段时间 – user1412

+0

只需写在这里,我会在有空时回答,而我现在很急。 –

+0

我想对PCRE的使用有一些清晰的认识,因为你之前的代码也在工作。让我再次通过你的笔记,了解其好处。 – user1412