我有一个要求,我正在处理一个有双字节字符的大数据,韩文文本。我想寻找一个角色并替换它。为了在浏览器中正确显示韩语文本,我更改了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设置吗?怎么做?
答案 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查看有关动词的更多详细信息。