我有一个字符串:
q <-"<U+00A6> 1000-66329"
我希望移除<U+00A6>
并仅获得1000 66329
。
我尝试使用:
gsub("\u00a6"," ", q,perl=T)
但它并没有删除任何东西。我应该如何使用gsub
才能仅得到1000 66329
?
<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在线演示
"\u00a6"
模式与 PCRE 正则表达式不兼容,要匹配 Unicode 代码点,需要使用 \x{00a6}
的表示法。但是正如您自己提到的,您有一个字面意义为 <U+...>
的子字符串需要删除,因此您不需要它。 - Wiktor Stribiżew如果 always 是第一个字符,你可以尝试以下方法:
substring("\U00A6 1000-66B29", 2)
<U+00A6> 1000-66329
而不是¦ 1000-66B29
,那么<U+00A6>
会被解释为字符串"<U+00A6>"
而不是unicode字符。此时你可以进行以下操作:substring("<U+00A6> 1000-66329",9)
[1] " 1000-66329"
trimws(gsub("\\S+\\s+|-", " ", q))
#[1] "1000 66329"
不应该删除它,而是应该将其转换为适当的格式...您需要将本地设置为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")
。
'<U+00A6>'
?因为这就是你的代码目前正在做的事情,而其他部分在这种情况下并没有太多意义。 - Konrad Rudolph