我已经提取了twitch streamers名称的数据集的第一列。有些streamer的拉丁用户名在括号中。
"TheRealKnossi"
"TheGrefg"
"YoDa"
"Pestily"
"<U+D55C><U+B3D9><U+C219> (handongsuk)"
"GamesDoneQuick"
"<U+8001><U+76AE> (mobilmobil)"
我想用括号内的值替换原来的值:
"TheRealKnossi"
"TheGrefg"
"YoDa"
"Pestily"
"handongsuk"
"GamesDoneQuick"
"mobilmobil"
我尝试使用gsub()
gsub("(?<=\()[^()]*(?=\))(*SKIP)(*F)|.", "", channels, perl=T)
问题是它适用于所有vector元素:
""
""
""
""
"handongsuk"
""
"mobilmobil"
您的问题是(?<=()[^()]*(?=))(*SKIP)(*F)
匹配最内层圆括号(括号)之间的子字符串,不包括括号本身,并跳过匹配,然后.
匹配任何字符(但换行字符,因为您在代码中使用PCRE正则表达式),因此gsub
删除这些字符,但括号中的子字符串。
您可以使用tregex sub
解决方案,如
sub(".*\(([^()]*)\).*", "\1", channels)
参见regex演示。细节:
-
.*
-任何零或更多字符,尽可能多 -
(
- a(
char -
([^()]*)
-第1组(1
):除(
和)
以外的任何零或多个字符 -
)
- a)
char -
.*
-任何零或更多字符,尽可能多。