我刚刚开始了解R语言,以前使用过python。挑战是将字符串中每个单词的最后一个字符替换为*。
它应该是什么样子:example text in string
,结果工作:exampl* tex* i* strin*
我的代码:
library(tidyverse)
library(stringr)
string_example = readline("Enter our text:")
string_example = unlist(strsplit(string_example, ' '))
string_example
result = str_replace(string_example, pattern = "*b", replacement = "*")
result
我得到一个错误:
> result = str_replace(string_example, pattern = "*b", replacement = "*")
Error in stri_replace_first_regex(string, pattern, fix_replacement(replacement), :
Syntax error in regex pattern. (U_REGEX_RULE_SYNTAX, context=``)
帮助解决任务
哦,我注意到一个错误,模式应该是.b
。这就是代码的执行方式,但字符串中没有替换
如果你指的是只由字母组成的单词,你可以使用
string_example <- "example text in string"
library(stringr)
str_replace_all(string_example, "\p{L}\b", "*")
## => [1] "exampl* tex* i* strin*"
请参阅R演示和regex演示。
详细信息:
p{L}
-与任何Unicode字母匹配的Unicode类别(属性(类b
-一个单词边界,在这种情况下,它确保右边没有其他单词字符。如果与p{L}
匹配的字母后面紧跟着字母、数字或_
(这些都是单词字符(,则匹配失败。如果要将其限制为字母检查,请将b
替换为(?!p{L})
注意,反斜杠是加倍的,因为在常规字符串文字中,反斜杠用于形成字符串转义序列,因此需要对其本身进行转义,以便在字符串文字中引入文字反斜杠。
需要考虑的更多事项
- 如果不想更改一个字母的单词,请在开头添加一个非单词边界
"\B\p{L}\b"
- 如果您想避免匹配后面跟着
-
+另一个字母(即一些复合词(的字母,您可以添加一个前瞻性检查:"\p{L}\b(?!-)"
您可以根据需要组合查找和(非(单词边界。