字符串替换涉及到的,最主要的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行。您可以根据需要更改
字符串
和填充行数。