【问题标题】:gsub ignore case on matching but output should follow original casegsub 在匹配时忽略大小写,但输出应遵循原始大小写
【发布时间】:2021-10-07 17:03:19
【问题描述】:

我想匹配 log-in 而不管它的大小写,但 log-in (with ignore case) 的结果匹配应该遵循其原始大小写。

txt <- 'log-in LOG-in LOG-IN LOG IN log-on LOG-on LOG-ON LOG ON 23-2'
have <- gsub(pattern = 'log[ -]in',replacement ='login' ,x = txt,ignore.case = T)
have 
> "login login login login log-on LOG-on LOG-ON LOG ON 23-2"

want
> "login LOGin LOGIN LOGIN log-on LOG-on LOG-ON LOG ON 23-2"

【问题讨论】:

    标签: r regex gsub


    【解决方案1】:

    试试这个:

    gsub(pattern = '(log)[ -](in)', replacement ='\\1\\2' , x = txt, ignore.case = T)
    [1] "login LOGin LOGIN LOGIN log-on LOG-on LOG-ON LOG ON 23-2"
    

    这适用于反向引用:\\1指回第一个捕获组 (log) 并以其确切形式(包括大小写)“记住”它,(log),而 \\2 指回第二个捕获组(in)

    【讨论】:

    • 也期待读你的书,看起来像是我在玩我的文本数据时需要的东西
    • 哦,太好了!谢谢你
    【解决方案2】:

    一种方法是将login 命名为一个组,并在替换文本中使用“\1”和“\2”。

    txt <- 'log-in LOG-in LOG-IN LOG IN log-on LOG-on LOG-ON LOG ON 23-2'
    gsub("(log)[ -](in)", "\\1\\2", txt, ignore.case=TRUE)
    

    【讨论】:

    • 我还没有:p 你的在我做最后检查的时候进来了。我不介意删除这个(或让某人删除这个),因为代码完全相同......
    【解决方案3】:

    或者,如果您想一次性同时登录和注销,您可以在“g”之后替换“-”或“”。

    want <- gsub(x = txt, pattern = "(?<=g)[- ]", '', perl = TRUE,ignore.case = T)
    

    如果您只是想登录,也请提前查看。

    want <- gsub(x = txt, pattern = "(?<=g)[- ](?=i)", '', perl = TRUE,ignore.case = T)
    

    【讨论】:

    • 是的,但是如果有一些误报字符串与- 后跟g 具有相同的模式,这将无法扩展。
    • 然后将其更改为 '(?
    猜你喜欢
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    相关资源
    最近更新 更多