R utf-8并根据结束字符替换句子中的单词

时间:2017-03-08 13:49:41

标签: r regex utf-8 data.table gsub

我有一个要求,我正在处理一个有双字节字符的大数据,韩文文本。我想寻找一个角色并替换它。为了在浏览器中正确显示韩语文本,我更改了R中的语言环境设置。但不确定它是否也会更新代码。下面是我将区域设置更改为韩国的代码,韩文文本在查看器中可以正常显示,但是在控制台中它会在打印时显示垃圾字符 -

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设置吗?怎么做?

1 个答案:

答案 0 :(得分:1)

由于您需要匹配单词 end 中的字母,因此您需要在字母之后放置\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) - 重复整个Group 1子模式的子例程调用
    • \\) - 文字)
  • $ - 字符串结束。

现在,如果你需要将两者结合起来,你会发现R PCRE驱动的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查看有关动词的更多详细信息。