相关文章推荐
道上混的上铺  ·  “ORA-01427 ...·  1 年前    · 
闷骚的木耳  ·  javascript - ...·  1 年前    · 
重情义的炒粉  ·  python - error while ...·  1 年前    · 

字符串替换涉及到的,最主要的3个内容: string pattern replacement ,分别对应从哪里去匹配、匹配什么、以及要替换成什么。

举个例子,将下示字符串中的 "Intrahepatic" 替换为 "Extrahepatic":

test = "YES329Intrahepatic RecurrenceNoNONOYESNo123"

sub("Intrahepatic", "Extrahepatic", test)

[1] "YES329Extrahepatic RecurrenceNoNONOYESNo123"

其实就是最简单的, 识别一个内容并替换为一个内容!

如果存在多个匹配,如将 test 中所有的 "No" 全部替换为 "no",则需要使用 gsub 函数:

gsub("No", "no", test)

注意,字符串中的 "NO" 并没有被替换,意味着 区分大小写!

所以,如果想将所有可能的大小写情况都被纳入替换,需要列举出所有可能并以"|"间隔:

gsub("No|NO|no|nO", "no", test)

或者用"[]"列举出每个字母出现的可能:

gsub("[Nn][Oo]", "no", test)

即,将 多个不同的内容替换成一个相同的内容

其实,本例比较特殊,大小写的问题在 gsub 中设置参数 ignore.case = T 即可:

gsub("No", "no", test, ignore.case = T)

上示部分写法涉及到使用 正则表达式 。再比如,将字符串中的空格和结尾处的数字替换为"-":

gsub("\\s|\\d+$", "-", test)

[1] "YES329Intrahepatic-RecurrenceNoNONOYESNo-"

更进一步的,我们能否在一句命令中实现多种替换?即,将上示三个替换过程在一句命令中完成!

方法1:简单组合

gsub("Intrahepatic", "Extrahepatic", gsub("[Nn][Oo]", "no", gsub("\\s|\\d+$", "-", test)))

[1] "YES329Extrahepatic-RecurrencenononoYESno-"

以前我会用这种写法,不依赖其他包,简单有效,来几个组几个。但是!随之可读性也会变差,而且总觉得有点冗余,不够智能,只给出对应关系不行吗?

方法2:stringr 包中的 str_replace_all 函数:

p_load(stringr)    # 安装加载stringr

str_replace_all(test, c("Intrahepatic" = "Extrahepatic", "[Nn][Oo]" = "no", "\\s|\\d+$" = "-"))

直接给出替换的对应关系,用"="连接一目了然,代码无冗余,而且把 string 放在第一个参数很舒服啊!

方法3:mgsub包中的 mgsub 函数:

p_load(mgsub)

mgsub(test, c("Intrahepatic", "[Nn][Oo]", "\\s|\\d+$"), c("Extrahepatic", "no", "-"), recycle = T)

这里将 pattern replacement 分开写的设计很人性化, str_replace_all 中就不支持这种写法。

需要注意的是,如果正则配的内容与替换的长度不一致时(如上,"\s" 和 "\\d+$" 同时对应 "-"),需要添加参数 recycle = T,否则报错:

pattern and replacement vectors must be the same length

哦,对了,这个时候你输入test会发现还是替换前的内容,是因为上示的替换均是生成一个新的字符串,所以没赋值就不会覆盖掉之前的test!

哦,还有...新来的小伙伴

如果你在执行 p_load 的时候报错

字符串替换涉及到的,最主要的3个内容:string、pattern 和 replacement,分别对应从哪里去匹配、匹配什么、以及要替换成什么。举个例子,将下示字符串中的 "Intrahepatic" 替换为 "Extrahepatic":test = "YES329Intrahepatic RecurrenceNoNONOYESNo123"sub("Intrahepatic", "E...
'示例:=myget(srg,1,3)'从第 3 位开始取出 字符 ' =myget(srg,2)'从第 1 位开始取出英文字母,第 3个参数省略默认为 1' =myget(srg,,5)'从第 5 位开始取出数字,第 2个参数省略默认为 0' =myget(srg) '第 2、3 个参数都省略,默认为从第 1 位取出所有数字
For Each ib In ActiveDocument.Paragraphs '排除表格 If ib.Range.Information(wdWithInTable) = False Then ib.Range.Select '缩进不一定是2个 字符 ,只要缩进不为0就 替换 ,避免标题、主送对象等误操作
实例需求: 待处理 字符 重:`5*s+s[面积s=222m2]+s*5[套s=333m2s]+s+s/s^2` 处理规则:将保留 括号 字符 ,将其他部分 字符 的s 替换 数字3 结果为:`5*3+3[面积s=222m2]+3*5[套s=333m2s]+3+3/3^2`
Warning message: In stri_replace_first_regex(string, pattern, fix_replacement(replacement), : argument is not an atomic vector; coercing 我用data.table::fread来读入txt;因为我有的col没有element,所以用read secondString = "World" resultString = firstString & " " & secondString lastRow = Range("A" & Rows.Count).End(xlUp).Row '将结果填充到下一行 Range("A" & lastRow + 1).Value = resultString '向下填充 For i = lastRow + 2 To lastRow + 10 Range("A" & i).Value = resultString Next i End Sub 这段代码将在当前活动工作表的第一列 连接 字符串 “Hello”和“World”,并将结果填充到当前最后一行的下一行。然后,它将向下填充该结果,直到下面的10行。您可以根据需要更改 字符串 和填充行数。