【问题标题】:R sub with back reference not replacing properly带有后向参考的 R sub 没有正确替换
【发布时间】:2018-01-09 20:47:10
【问题描述】:

我正在尝试从一些文件名中提取一个字符串,以便稍后用作变量。

文件名如下所示:

c("./Vote/Академический vote 1.xls", "./Vote/Академический vote 2.xls", 
"./Vote/Академический vote 3.xls", "./Vote/Алексеевский в городе Москве vote 1.xls", 
"./Vote/Алексеевский в городе Москве vote 2.xls", "./Vote/Алтуфьевский vote 1.xls", 
"./Vote/Алтуфьевский vote 2.xls", "./Vote/Алтуфьевский vote 3.xls", 
"./Vote/Арбат vote 1.xls", "./Vote/Арбат vote 2.xls", "./Vote/Аэропорт vote 1.xls", 
"./Vote/Аэропорт vote 2.xls", "./Vote/Аэропорт vote 3.xls", "./Vote/Бабушкинский vote 1.xls", 
"./Vote/Бабушкинский vote 2.xls", "./Vote/Басманный vote 1.xls", 
"./Vote/Басманный vote 2.xls", "./Vote/Басманный vote 3.xls", 
"./Vote/Беговой vote 1.xls", "./Vote/Беговой vote 2.xls", "./Vote/Бескудниковский vote 1.xls", 
"./Vote/Бескудниковский vote 2.xls", "./Vote/Бибирево vote 1.xls", 
"./Vote/Бибирево vote 2.xls", "./Vote/Бибирево vote 3.xls")
> dput(sample(vote_files, size = 25))
c("./Vote/Лианозово vote 2.xls", "./Vote/Зюзино vote 1.xls", 
"./Vote/Восточное Дегунино vote 2.xls", "./Vote/Аэропорт vote 2.xls", 
"./Vote/Академический vote 1.xls", "./Vote/Замоскворечье в городе Москве vote 1.xls", 
"./Vote/Обручевский vote 2.xls", "./Vote/Даниловский vote 3.xls", 
"./Vote/Нагатино-Садовники vote 1.xls", "./Vote/Ново-Переделкино в городе Москве vote 1.xls", 
"./Vote/Кунцево vote 2.xls", "./Vote/Текстильщики в городе Москве vote 2.xls", 
"./Vote/Южное Медведково vote 1.xls", "./Vote/Западное Дегунино vote 2.xls", 
"./Vote/Хамовники vote 1.xls", "./Vote/Крюково vote 1.xls", "./Vote/Беговой vote 1.xls", 
"./Vote/Восточный vote 1.xls", "./Vote/Богородское vote 2.xls", 
"./Vote/Некрасовка vote 2.xls", "./Vote/Косино-Ухтомский vote 1.xls", 
"./Vote/Лосиноостровский vote 3.xls", "./Vote/Хорошевский vote 2.xls", 
"./Vote/Бирюлево Западное vote 2.xls", "./Vote/Гольяново vote 3.xls"
)

我正在尝试使用sub 提取/Vote//vote #.xls 之间的俄语文本,如下所示

sub(x= string, pattern = ".*((?<=.//Vote//).*(?=vote)).*", replacement = "\\1", perl = T)

我必须使用环视,因为我要提取的字符串有时不止一个单词。然而,尽管当我在在线正则表达式测试器上验证时,捕获组似乎捕获了正确的文本,但 sub 调用只返回与我输入的完全相同的字符串。

这里有什么问题?或者,有没有更简单的方法来做到这一点?

【问题讨论】:

标签: r regex substring backreference capturing-group


【解决方案1】:

正如问题下的 cmets 中所述,如果双斜杠是单斜杠,则您的正则表达式将起作用(尽管没有提到,“投票”也被替换为“投票”,即前面有一个空格)。

关于更简单的方法,basename 将获取文件名部分,之后我们可以将vote 后面的空格以及后面的所有内容替换为空字符串:

sub(" vote.*", "", basename(x))

给予:

 [1] "Лианозово"                        "Зюзино"                          
 [3] "Восточное Дегунино"               "Аэропорт"                        
 [5] "Академический"                    "Замоскворечье в городе Москве"   
 [7] "Обручевский"                      "Даниловский"                     
 [9] "Нагатино-Садовники"               "Ново-Переделкино в городе Москве"
[11] "Кунцево"                          "Текстильщики в городе Москве"    
[13] "Южное Медведково"                 "Западное Дегунино"               
[15] "Хамовники"                        "Крюково"                         
[17] "Беговой"                          "Восточный"                       
[19] "Богородское"                      "Некрасовка"                      
[21] "Косино-Ухтомский"                 "Лосиноостровский"                
[23] "Хорошевский"                      "Бирюлево Западное"               
[25] "Гольяново"                       

更新:处理带有嵌入空格的短语。

【讨论】:

  • sub(" .*", "", basename(x)) 将返回错误的结果。对于"./Vote/Алексеевский в городе Москве vote 1.xls",结果应为Алексеевский в городе Москвеsub(" .*", "", basename(x)) 只返回 Алексеевский
  • 谢谢,非常优雅!
【解决方案2】:

只需删除一致的内容,而不是捕获中间的文本。

vote_files2 <- sub("./Vote/", "", vote_files)
vote_files2 <- sub(" vote \\d*.xls", "", vote_files2)
vote_files2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 2022-09-30
    相关资源
    最近更新 更多