【发布时间】:2020-02-24 00:38:16
【问题描述】:
我有一个来自 pdf 提取的长字符。下面是一个 MWE:
MWE <- "4 BLABLA\r\n Table 1. Real GDP\r\n Percentage changes\r\n 2016 2017 \r\nArgentina -2.5 2.7\r\nAustralia 2.6 2.5\r\n BLABLA \r\n Table 2. Nominal GDP\r\n Percentage changes\r\n 2011 2012\r\nArgentina 31.1 21.1\r\nAustralia 7.7 3.3\r\n"
我想把它分成一个列表,每个元素都是一个表格。 I can do that 与:
MWE_1 <- as.list(strsplit(MWE, "(?<=[Table\\s+\\d+\\.\\s+(([A-z]|[ \t]))+\\r\\n])"))
> MWE_1
[[1]]
[1] "4 BLABLA\r\n "
[2] " Percentage changes\r\n 2016 2017 \r\nArgentina -2.5 2.7\r\nAustralia 2.6 2.5\r\n BLABLA 5\r\n "
[3] " Percentage changes\r\n 2011 2012\r\nArgentina 31.1 21.1\r\nAustralia 7.7 3.3\r\n"
但我想保留分隔符,这是一个非常长的正则表达式。
我看了一点,似乎一个不错的方法是尝试lookbehinds。但是,我不知道如何连接我的长正则表达式。例如,MWE_2 <- as.list(strsplit(MWE, "(?<=[Table\\s+\\d+\\.\\s+(([A-z]|[ \t]))+\\r\\n])"))
产生错误:
invalid regular expression '(?<=[Table\s+\d+\.\s+(([A-z]|[ ]))+\r\n])', reason 'Invalid regexp'
如何以紧凑的方式做到这一点?
另外,有没有不保留第一个元素的直接方法?
【问题讨论】:
-
你写 我可以用 :
MWE_1 <- …做到这一点,但这与MWE_2 <- …的表达方式完全相同,而且 会产生错误,所以你不能用这个表达式做任何事情,尤其是没有收到你为MWE_1显示的结果。 -
感谢您的意见,但您尝试过吗?这实际上是我得到的(我添加了我得到的截图)。从给出的答案来看,我猜是在 R 中,后视和前瞻在其标准形式中没有被考虑在内,这就是为什么您需要指定
prel=TRUE选项,然后使用?=。我不清楚为什么它不适用于?<=,但没有它我仍然可以做我想做的事。 -
是的,我试过了。您在屏幕截图中显示的表达式(不是以
(?<=[开头)与您在问题文本中给出的表达式不同。