仅将正则表达式应用于短语的第一个单词(用空格定义)

时间:2019-04-01 00:48:24

标签: r regex

我使用此正则表达式将字母与单词的数字(和符号)分开:(?<=[a-zA-Z])(?=([[0-9]|[:punct:]]))。我的测试字符串是:"CALLE15 CRA22"

我只想将此正则表达式应用于该句子的第一个单词(该单词用空格定义)。即,我只想将其应用于"CALLE15"

一个解决方案是将字符串(句子)分成单词,然后将正则表达式应用于第一个单词,但是我想在一个正则表达式中全部完成。其他解决方案是使用r stringr::str_replace() (or sub())仅替换第一个匹配项,但出于其他原因,我需要stringr::str_replace_all (or gsub())

我需要的是在使用替换功能进行的两者之间插入一个空格。我想要的结果是"CALLE 15 CRA22",并具有"CALLE15 CRA 22"的可能性。我为该位置尝试了很多职位,一无所获,一开始都没有^

https://rubular.com/r/7dxsHdOA3avTdX

感谢您的帮助!!!!

1 个答案:

答案 0 :(得分:1)

我不确定您的问题陈述(请参阅上面的评论),但是以下内容重现了您的预期输出并使用了str_replace_all

ss <- "CALLE15 CRA22"
library(stringr)
str_replace_all(ss, "^([A-Za-z]+)(\\d+)(\\s.+)$", "\\1 \\2\\3")
#[1] "CALLE 15 CRA22"

更新

要从上面的注释中复制示例字符串的输出

ss <- "CLL.6 N 5-74NORTE"

pat <- c(
    "(?<=[A-Za-z])(?![A-Za-z])",
    "(?<![A-Za-z])(?=[A-Za-z])",
    "(?<=[0-9])(?![0-9])",
    "(?<![0-9])(?=[0-9])")

library(stringr)
str_split(ss, sprintf("(%s)", paste(pat, collapse = "|"))) %>%
    unlist() %>%
    .[nchar(trimws(.)) > 0] %>%
    paste(collapse = " ")
#[1] "CLL . 6 N 5 - 74 NORTE"