1

我有一个字符串,我试图用相应的替换替换第一个匹配模式。EG 在我下面的示例中:如果bb首先找到,将其替换为foo并且不替换任何其他内容,但如果cc首先找到,则将其替换为bar并且不替换任何其他内容。

这几乎符合预期,除了replacement参数不被解释为正则表达式,而是作为一个完整的字符串。(但pattern根据需要,该参数被视为正则表达式)。

stri_replace_first_regex(
  c(" bb cc bb cc "," cc bb cc bb ", " aa bb cc "), 
  pattern = " bb | cc ", 
  replacement = " foo | bar ")

输出:" foo | bar cc bb cc " " foo | bar bb cc bb " " aa foo | bar cc "

虽然我希望它输出" foo cc bb cc " " bar bb cc bb" " aa foo cc "

关于如何解决这个问题的任何想法?

谢谢。

更多上下文:

我的输入几乎可以有任何格式,它们是客户输入的邮政地址,我需要用标准化的东西替换街道的类型(例如,street变成stroadinrdavenuein av)。这些单词中的任何一个都可以再次出现(例如),所以我只认为第一次出现是有效的,并且不能替换列表20 bis road of sesame street中单词的后续出现。pattern

4

2 回答 2

3

您可以使用qdapmgsub进行这些替换:

> input <- c("1 road of whatever road", "1 street of whatever street")
> pattern = c("^(.*?)\\bstreet\\b","^(.*?)\\broad\\b")
> replacement = c("\\1st","\\1rd")
> mgsub(pattern, replacement, input, fixed=FALSE, perl=TRUE)
[1] "1 rd of whatever road"   "1 st of whatever street"

这些模式包括^(字符串开头),(.*?)一个捕获组,匹配任何字符,但换行符尽可能少,直到第一次出现整个单词(由于单词边界\bstreetroad.

替换模式对\\1使用捕获组捕获的文本和要替换的单词具有反向引用 ( )。

于 2016-05-30T14:49:45.977 回答
0

Read ?stringi::stri_replace_first_regex; pattern and replacement are vectorized, so if you pass them a vector of strings, each pattern will be replaced with the respective replacement:

stringi::stri_replace_first_regex(
    c(" bb cc bb cc "," cc bb cc bb "), 
    pattern = c("bb", "cc"), 
    replacement = c("foo", "bar"))
# [1] " foo cc bb cc " " bar bb cc bb "
于 2016-05-30T15:06:44.343 回答