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"