我有一个字符串,我试图用相应的替换替换第一个匹配的模式。以下示例中的EG:如果首先找到bb
,请将其替换为foo
并替换其他任何内容,但如果先找到cc
,请将其替换为{{ 1}}并且不要替换其他任何东西。
除了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
, st
中的road
和rd
中的avenue
。任何这些单词都可以再次出现(例如av
),所以我认为只有第一次出现是有效的,并且不能替换20 bis road of sesame street
列表中单词的后续出现。
答案 0 :(得分:3)
您可以使用 qdap 库mgsub
进行替换:
> 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"
模式包括^
(字符串的开头),(.*?)
匹配任何字符的捕获组,但新行尽可能少,直到第一次出现整个单词(由于单词边界) \b
)street
和road
。
替换模式对使用捕获组捕获的文本和要替换的单词进行反向引用(\\1
)。
答案 1 :(得分:0)
阅读?stringi::stri_replace_first_regex
; pattern
和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 "