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

R utf-8 and replace a word from a sentence based on ending character

我有一个要求,我正在处理一个具有双字节字符的韩文文本大数据。我想寻找一个角色并替换它。为了在浏览器中正确显示韩语文本,我更改了 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 设置吗?如何设置?

因为你需要匹配单词结尾处的字母,你需要在\b(单词边界)之后放置 字母,以便要求在该字母之后从字母过渡到非字母(或字符串结尾)。将处理此问题的 PCRE 模式是

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

详情

  • \s* - 零个或多个空格
  • \b - 前导词边界
  • \p{L}* - 零个或多个字母[=7​​7=]
  • - 您的特定字母[=7​​7=]
  • \b - 词尾

第二个问题是您需要删除字符串末尾的一组嵌套括号。您需要再次依赖 PCRE 正则表达式 (perl=TRUE),它可以在子例程调用的帮助下处理递归。

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

详情:

  • \s* - 零个或多个空格
  • (\((?:[^()]++|(?1))*\)) - 第 1 组(将递归)匹配
    • \( - 文字 (
    • (?:[^()]++|(?1))* - 零次或多次出现
      • [^()]++ - () 以外的 1 个或多个字符(所有)
      • | - 或
      • (?1) - 重复整个第 1 组子模式的子例程调用
    • \) - 文字 )
  • $ - 字符串结尾。

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

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

或使用 trimws 去除 leading/trailing 空格:

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

PCRE Man page 查看有关动词的更多详细信息。