如何从字符串中删除Unicode <U+00A6>?

9

我有一个字符串:

q <-"<U+00A6>  1000-66329"

我希望移除<U+00A6>并仅获得1000 66329

我尝试使用:

gsub("\u00a6"," ", q,perl=T)

但它并没有删除任何东西。我应该如何使用gsub才能仅得到1000 66329


1
以分隔符(空格?)为标准进行拆分,然后获取文本的第二部分。 - zx8754
2
实际的赋值是什么样子的?你是在分配Unicode字符U+00A6还是字面字符字符串'<U+00A6>'?因为这就是你的代码目前正在做的事情,而其他部分在这种情况下并没有太多意义。 - Konrad Rudolph
实际上我有一个数据框,其中一列的值类似于"<U+00A6> 1000-66329",而这个<U+00A6>是断杠符(¦)的unicode编码,它出现在所有值的开头。我想要从我的数据中移除这个意外的符号。 - user6559913
或许你可以尝试将那个 ¦ 复制并粘贴到你的gsub中。 - Hong Ooi
4个回答

6
我只是想删除字符串开头的Unicode字符<U+00A6>。您不需要使用gsub,可以使用带有"^\\s*<U\\+\\w+>\\s*"模式的sub函数:
q <-"<U+00A6>  1000-66329"
sub("^\\s*<U\\+\\w+>\\s*", "", q)

模式详情:

  • ^ - 字符串的开始位置
  • \\s* - 零个或多个空格
  • <U\\+ - 字面字符序列 <U+
  • \\w+ - 一个或多个字母、数字或下划线
  • > - 字面>
  • \\s* - 零个或多个空格。

如果您需要将 - 替换为空格,请添加 |- 选项,并使用 gsub(因为现在我们期望进行多个替换并且替换必须是一个空格 - 与 akrun's answer 相同):

trimws(gsub("^\\s*<U\\+\\w+>|-", " ", q))

查看R在线演示


1
这是在删除(ASCII)字符串“<U+00A6>”,而不是Unicode字符。 - Hong Ooi
这个对我来说运作得非常完美。非常感谢你提供的解决方案。 - user6559913
1
@HongOoi:没错,这就是OP在输入中的内容。 - Wiktor Stribiżew
1
FYI,"\u00a6" 模式与 PCRE 正则表达式不兼容,要匹配 Unicode 代码点,需要使用 \x{00a6} 的表示法。但是正如您自己提到的,您有一个字面意义为 <U+...> 的子字符串需要删除,因此您不需要它。 - Wiktor Stribiżew

3

如果 always 是第一个字符,你可以尝试以下方法:

substring("\U00A6 1000-66B29", 2)

如果R打印的字符串是<U+00A6> 1000-66329而不是¦ 1000-66B29,那么<U+00A6>会被解释为字符串"<U+00A6>"而不是unicode字符。此时你可以进行以下操作:
substring("<U+00A6>  1000-66329",9)

无论哪种方式,结果都是:
[1] "  1000-66329"

谢谢您提供的解决方案。但是它给我返回了 "006 1000 66329" ,而且我的一些字符串中也包含字母,例如 "<U+00A6> 1000-66B29"。 我只想删除字符串开头的Unicode字符 <U+00A6>。 - user6559913

2
我们还可以进行以下操作。
trimws(gsub("\\S+\\s+|-", " ", q))
#[1] "1000 66329"

2

不应该删除它,而是应该将其转换为适当的格式...您需要将本地设置为UTF-8,如下所示:

Sys.setlocale("LC_CTYPE", "en_US.UTF-8")

也许你会看到以下信息:
Warning message:
In Sys.setlocale("LC_CTYPE", "en_US.UTF-8") :
  OS reports request to set locale to "en_US.UTF-8" cannot be honored

在这种情况下,您应该使用 stringi::stri_trans_general(x, "zh")
这里的 "zh" 表示 "中文"。您应该知道需要转换成哪种语言。就是这样。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接