如何使用 R 中的正则表达式删除字符串中表情符号的 Unicode 表示?
我正在使用Twitter API中的数据,并且在用户在其名称字段中包含表情符号的任何地方,它们都被转换为我的数据框中的Unicode字符串表示形式。我的数据的结构有点像这样:
user_profiles <- as.data.frame(c("Susanne Bold", "Julian K. Peard <U+0001F41C>",
"<U+0001F30A> Alexander K Miller <U+0001F30A>", "John Mason"))
colnames(user_profiles) <- "name"
看起来像这样:
name
1 Susanne Bold
2 Julian K. Peard <U+0001F41C>
3 <U+0001F30A> Alexander K Miller <U+0001F30A>
4 John Mason
我现在试图使用Regexp将实际名称隔离到一个新列中:
user_profiles <- user_profiles %>%
mutate(clean_name = str_remove_all(name, "\\<U\\+[[:alnum:]]\\>[ ]?"))
但是此表达式1。似乎很复杂且2。 。我已经尝试了REGEXP的多种变体,奇怪的是, GREPL
能够使用此版本检测模式( string_remove_all
不接受,因为它缺少闭幕式支架):
grepl("\\<U\\+[[:alnum:]\\>[ ]?", user_profiles$name)
[1] FALSE TRUE TRUE FALSE
# note that the second bracket around alnum is left opened
有人可以解释这一点或提供更轻松的解决方案吗?
多谢!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
第一个
str_remove_all
不起作用,因为您错过了字母数字模式后面的+
量词。另请注意,在之后,仅使用十六进制字符,因此您可以使用更精确的
[:xdigit,而不是
POSIX 字符类。[:alnum:]
:]您可以使用
Do not escape
<
和>
,它们在任何正则表达式风格中都不是特殊的,并且在 TRE 正则表达式中,与基本正则表达式函数一起使用,无需 Perl =TRUE,\<
和\>
是字边界。模式详细信息
-
字符串
\+
- 文字+
[[:xdigit:]]+
- 一个或多个十六进制字符>
- 一个>
字符\s*< /code> - 零个或多个空格。
为什么
grepl
正则表达式有效?这很有趣,因为您省略了]
右括号表达式边界字符,并“破坏”了正则表达式以进行如下匹配:\ - 单词边界(在 TRE 中,
\<
匹配左侧单词边界),然后U+
字符串[[:alnum:]\>[ ]? - 这是一个可选的括号表达式匹配集合中的一个或零个字符:
- 一个空格。
[:alnum:]
- 任何字母数字字符\
- 反斜杠(是的,因为在 TRE 正则表达式风格中,正则表达式转义序列按字面处理)>
->
字符[
- 一个[
字符因此,例如,它与
中的
匹配。
The first
str_remove_all
does not work because you missed the+
quantifier after the alphanumeric pattern. Also, note that after<U+
, only hex chars are used, so instead of[:alnum:]
, you can use a more precise[:xdigit:]
POSIX character class.You can use
Do not escape
<
and>
, they are never special in any regex flavor, and in TRE regex, used with base regex functions withoutperl=TRUE
, the\<
and\>
are word boundaries.Pattern details
<U
-<U
string\+
- a literal+
[[:xdigit:]]+
- one or more hex chars>
- a>
char\s*
- zero or more whitespaces.Why does the
grepl
regex work? This is interesting, because you omitted the]
closing bracket expression boundary char, and "spoilt" the regex to match like this:\<U\+
- a word boundary (in TRE,\<
matches a left-hand word boundary) and thenU+
string[[:alnum:]\>[ ]?
- this is an optional bracket expression that matches one or zero chars from the set:[:alnum:]
- any alphanumeric char\
- a backslash (yes, because in TRE regex flavor, regex escape sequences are treated literally)>
- a>
char[
- a[
charSo, it matches
<U+0
in<U+0001F41C>
, for example.这是我们可以做到的另一种方法:
Here is an alternative way how we could do it:
我们可以为
[:alnum:]]
-Output添加一个或多个(
+
)We can add one or more (
+
) for the[[:alnum:]]
-output