将正则表达式应用于R中的字符串



我刚刚开始了解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(?!-)"

您可以根据需要组合查找和(非(单词边界。

相关内容

  • 没有找到相关文章

最新更新