【发布时间】:2021-10-16 01:17:48
【问题描述】:
我想从一个文本字符串的中间提取一个有小变化的数字。所需数字之前的字符数有时为 4 长,有时为 5 长。有时在所需数字后面有一个“[字母].docx”,而其他时候只有一个“.docx”。
我已经写了一个蛮力解决方案,但我想学习如何更优雅地做到这一点,有两个具体问题。
两个问题:
- 如何更一般地编写下面的正则表达式语言?在我的情况下,我能够蛮力,因为我只有十个变体,但我希望看到一个通用的解决方案。
- 为什么 array() 选项不起作用?我正在尝试实现我所理解的描述here。在我的例子中,出于某种原因,R 在替换数组的第三个元素之后返回错误。
数据:
data$file
XX12_1a.docx
XX4_1b.docx
XX35_4.docx
XX9_3.docx
XX21_2.docx
目标:
data$id
1
1
4
3
2
SSCCE:
require('tidyverse')
data <- data.frame(file = c('XX12_1a.docx',
'XX4_1b.docx',
'XX35_4.docx',
'XX9_3.docx',
'XX21_2.docx'))
# Brute force solution:
data$id <- str_replace(data$file, '.....1a.....', '1')
data$id <- str_replace(data$id, '.....1b.....', '1')
data$id <- str_replace(data$id, '.....2.....', '2')
data$id <- str_replace(data$id, '.....3.....', '3')
data$id <- str_replace(data$id, '.....4.....', '4')
data$id <- str_replace(data$id, '....1a.....', '1')
data$id <- str_replace(data$id, '....1b.....', '1')
data$id <- str_replace(data$id, '....2.....', '2')
data$id <- str_replace(data$id, '....3.....', '3')
data$id <- str_replace(data$id, '....4.....', '4')
# More concise attempt, does not run
data$id2 <- str_replace(data$file,
array('.....1a.....',
'.....1b.....',
'.....2.....',
'.....3.....',
'.....4.....',
'....1a.....',
'....1b.....',
'....2.....',
'....3.....',
'....4.....'),
array('1', '1', '2', '3', '4', '1', '1', '2', '3', '4'))
【问题讨论】: