regex-使用字符定义边界&;分隔符
我意识到这是一个相当简单的问题,我已经在这个网站上搜索过了,但是我的语法似乎不适合下面的正则表达式挑战。我想做两件事。首先让正则表达式拾取前三个字符并在分号处停止。例如,我的字符串可能如下所示:regex-使用字符定义边界&;分隔符,r,regex,R,Regex,我意识到这是一个相当简单的问题,我已经在这个网站上搜索过了,但是我的语法似乎不适合下面的正则表达式挑战。我想做两件事。首先让正则表达式拾取前三个字符并在分号处停止。例如,我的字符串可能如下所示: Apt;House;Condo;Apts; 我想去这里 Apartment;House;Condo;Apartment 我还想创建一个正则表达式来替换分隔符之间的单词,同时保持其他单词不变。例如,我想从以下几点开始: feline;labrador;bird;labrador retriever;l
Apt;House;Condo;Apts;
我想去这里
Apartment;House;Condo;Apartment
我还想创建一个正则表达式来替换分隔符之间的单词,同时保持其他单词不变。例如,我想从以下几点开始:
feline;labrador;bird;labrador retriever;labrador dog; lab dog;
为此:
feline;dog;bird;dog;dog;dog;
下面是我正在使用的正则表达式。我知道^表示字符串的开头,$表示字符串的结尾。我尝试了许多变化,正在进行替换,但没有达到我想要的输出。我也猜一个正则表达式可以同时适用于两个正则表达式?谢谢大家的帮助
df$variable <- gsub("^apt$;", "Apartment;", df$variable, ignore.case = TRUE)
df$variable我建议分两步进行:
按分隔符拆分字符串
做替换
(可选,如果你要这么做的话)把琴弦打回去
要拆分字符串,我将使用stringr
库。但您也可以使用base R:
myString <- "Apt;House;Condo;Apts;"
# base R
splitString <- unlist(strsplit(myString, ";", fixed = T))
# with stringr
library(stringr)
splitString <- as.vector(str_split(myString, ";", simplify = T))
myString我建议分两步进行:
按分隔符拆分字符串
做替换
(可选,如果你要这么做的话)把琴弦打回去
要拆分字符串,我将使用stringr
库。但您也可以使用base R:
myString <- "Apt;House;Condo;Apts;"
# base R
splitString <- unlist(strsplit(myString, ";", fixed = T))
# with stringr
library(stringr)
splitString <- as.vector(str_split(myString, ";", simplify = T))
myString这里有一种使用look-behind的方法(因此需要perl=TRUE
):
*?
将匹配0个或更多字符,但尽可能少地匹配,直到下一个分号或行尾
如果您匹配分隔符,则可以跳过后面的查找(并且perl=TRUE
),然后将其包含在替换中:
> gsub("(;|^) *lab[^;]*", "\\1dog", tmp)
[1] "feline;dog;bird;dog;dog;dog;"
[2] "dog;feline;dog;bird;dog;dog;dog"
使用此方法时,您需要注意只在一侧匹配分隔符(我的示例中的第一个),因为匹配使用分隔符(而不是向前看或向后看),如果同时使用两个分隔符,然后将跳过下一个字段,并且只考虑替换其他字段。这里有一种使用look back的方法(因此您需要perl=TRUE
):
*?
将匹配0个或更多字符,但尽可能少地匹配,直到下一个分号或行尾
如果您匹配分隔符,则可以跳过后面的查找(并且perl=TRUE
),然后将其包含在替换中:
> gsub("(;|^) *lab[^;]*", "\\1dog", tmp)
[1] "feline;dog;bird;dog;dog;dog;"
[2] "dog;feline;dog;bird;dog;dog;dog"
使用此方法时,您需要注意只在一侧匹配分隔符(我的示例中的第一个),因为匹配使用分隔符(而不是向前看或向后看),如果同时使用两个分隔符,然后将跳过下一个字段,并且只考虑每隔一个字段进行替换。是否要替换整个单词?使用单词边界gsub(“\\bapt\\b”,“单元”,df$变量,ignore.case=TRUE)
。或者你需要特别替换分号和字符串开始/结束之间的子字符串吗?我认为你应该放弃正则表达式,使用面向字符串的函数。嗨@WiktorStribiżew,我想替换分号之间的子字符串以及字符串前面的单词。为了详细说明第二个示例,拉布拉多可以以多种不同的方式发布,包括拉布拉多寻回犬、拉布拉多犬、拉布拉多犬等。总之,我需要创建正则表达式,以识别开头的前三个字符和结尾的分隔符。希望这是有道理的。谢谢。我还是不确定,但是试试看——这有帮助吗?匹配包含整个单词的整个字段lab
或labrador
,并将整个字段替换为dog
。看起来这没有帮助。请澄清。你是想替换整个单词吗?使用单词边界gsub(“\\bapt\\b”,“单元”,df$变量,ignore.case=TRUE)
。或者你需要特别替换分号和字符串开始/结束之间的子字符串吗?我认为你应该放弃正则表达式,使用面向字符串的函数。嗨@WiktorStribiżew,我想替换分号之间的子字符串以及字符串前面的单词。为了详细说明第二个示例,拉布拉多可以以多种不同的方式发布,包括拉布拉多寻回犬、拉布拉多犬、拉布拉多犬等。总之,我需要创建正则表达式,以识别开头的前三个字符和结尾的分隔符。希望这是有道理的。谢谢。我还是不确定,但是试试看——这有帮助吗?匹配包含整个单词的整个字段lab
或labrador
,并将整个字段替换为dog
。看起来这没有帮助。请澄清。这太棒了,非常适合@Greg Snow!非常感谢。他不知道后面的样子。感谢您为提供此解决方案所花费的时间。此解决方案非常出色,在@Greg Snow!中效果完美!非常感谢。他不知道后面的样子。感谢您花时间提供此解决方案。
> gsub("(;|^) *lab[^;]*", "\\1dog", tmp)
[1] "feline;dog;bird;dog;dog;dog;"
[2] "dog;feline;dog;bird;dog;dog;dog"