逗号后只保留每个单词的第一个字母
Keep only the first letter of each word after a comma
我有像 Sacher, Franz Xaver
或 Nishikawa, Kiyoko
这样的字符串。
使用 R,我想将它们更改为 Sacher, F. X.
或 Nishikawa, K.
。
换句话说,逗号后每个单词的第一个字母应保留一个点(如果后面有另一个单词,则应保留一个空格)。
,但它不适用于我的案例 1:1,因为它的字符串中没有逗号; (<?=, )
的简单添加似乎不起作用。
例如在以下尝试中,gsub()
替换了所有内容,而我的 str_replace_all()
尝试导致错误:
TEST <- c("Sacher, Franz Xaver", "Nishikawa, Kiyoko", "Al-Assam, Muhammad")
# first attempt
# (resembles the response from the other thread)
gsub('\b(\pL)\pL{2,}|.','\U\1', TEST, perl = TRUE)
# second attempt
# error: "Incorrect unicode property"
stringr::str_replace_all(TEST, '(?<=, )\b(\pL)\pL{2,}|.','\U\1')
非常感谢您的帮助!
您可以使用
gsub("(*UCP)^[^,]+(*SKIP)(*F)|\b(\p{L})\p{L}*", "\U\1.", TEST, perl=TRUE)
参见regex demo。 详情:
(*UCP)
- PCRE 动词将使 \b
识别 Unicode
^[^,]+(*SKIP)(*F)
- 字符串开头,然后是逗号以外的任何零个或多个字符,然后匹配失败并跳过,下一个匹配从失败发生的位置开始
|
- 或
\b
- 单词边界
(\p{L})
- 第 1 组:任何 Unicode 字母
\p{L}*
- 零个或多个 Unicode 字母
参见R demo:
TEST <- c("Sacher, Franz Xaver", "Nishikawa, Kiyoko", "Al-Assam, Muhammad")
gsub("(*UCP)^[^,]+(*SKIP)(*F)|\b(\p{L})\p{L}*", "\U\1.", TEST, perl=TRUE)
## => [1] "Sacher, F. X." "Nishikawa, K." "Al-Assam, M."
拆分字符串的粗略方法:
TEST <- c("Sacher, Franz Xaver", "Nishikawa, Kiyoko", "Al-Assam, Muhammad")
sapply(strsplit(TEST, '\s+'), function(x)
paste0(x[1], paste0(substr(x[-1], 1, 1), collapse = '.'), '.'))
#[1] "Sacher,F.X." "Nishikawa,K." "Al-Assam,M."
一种使用多重反向引用的方法:
gsub("(\b\w+,\s)(\b\w).*(\b\w)*", "\1\2.\3", TEST)
[1] "Sacher, F." "Nishikawa, K." "Al-Assam, M."
在这里,我们使用三个捕获组通过反向引用在 gsub
的替换参数中进行反向引用:
(\b\w+,\s)
:首先,这个组捕获姓氏加上逗号后跟空格
(\b\w)
: this, second, group 捕获名字的首字母
(\b\w)
:第三组捕获中间名的首字母
我有像 Sacher, Franz Xaver
或 Nishikawa, Kiyoko
这样的字符串。
使用 R,我想将它们更改为 Sacher, F. X.
或 Nishikawa, K.
。
换句话说,逗号后每个单词的第一个字母应保留一个点(如果后面有另一个单词,则应保留一个空格)。
(<?=, )
的简单添加似乎不起作用。
例如在以下尝试中,gsub()
替换了所有内容,而我的 str_replace_all()
尝试导致错误:
TEST <- c("Sacher, Franz Xaver", "Nishikawa, Kiyoko", "Al-Assam, Muhammad")
# first attempt
# (resembles the response from the other thread)
gsub('\b(\pL)\pL{2,}|.','\U\1', TEST, perl = TRUE)
# second attempt
# error: "Incorrect unicode property"
stringr::str_replace_all(TEST, '(?<=, )\b(\pL)\pL{2,}|.','\U\1')
非常感谢您的帮助!
您可以使用
gsub("(*UCP)^[^,]+(*SKIP)(*F)|\b(\p{L})\p{L}*", "\U\1.", TEST, perl=TRUE)
参见regex demo。 详情:
(*UCP)
- PCRE 动词将使\b
识别 Unicode^[^,]+(*SKIP)(*F)
- 字符串开头,然后是逗号以外的任何零个或多个字符,然后匹配失败并跳过,下一个匹配从失败发生的位置开始|
- 或\b
- 单词边界(\p{L})
- 第 1 组:任何 Unicode 字母\p{L}*
- 零个或多个 Unicode 字母
参见R demo:
TEST <- c("Sacher, Franz Xaver", "Nishikawa, Kiyoko", "Al-Assam, Muhammad")
gsub("(*UCP)^[^,]+(*SKIP)(*F)|\b(\p{L})\p{L}*", "\U\1.", TEST, perl=TRUE)
## => [1] "Sacher, F. X." "Nishikawa, K." "Al-Assam, M."
拆分字符串的粗略方法:
TEST <- c("Sacher, Franz Xaver", "Nishikawa, Kiyoko", "Al-Assam, Muhammad")
sapply(strsplit(TEST, '\s+'), function(x)
paste0(x[1], paste0(substr(x[-1], 1, 1), collapse = '.'), '.'))
#[1] "Sacher,F.X." "Nishikawa,K." "Al-Assam,M."
一种使用多重反向引用的方法:
gsub("(\b\w+,\s)(\b\w).*(\b\w)*", "\1\2.\3", TEST)
[1] "Sacher, F." "Nishikawa, K." "Al-Assam, M."
在这里,我们使用三个捕获组通过反向引用在 gsub
的替换参数中进行反向引用:
(\b\w+,\s)
:首先,这个组捕获姓氏加上逗号后跟空格(\b\w)
: this, second, group 捕获名字的首字母(\b\w)
:第三组捕获中间名的首字母