【发布时间】:2018-06-17 18:03:46
【问题描述】:
这就是我希望能够做到的。
https://regex101.com/r/KchccA/1
我想匹配 = 和 ) 之间的任何字符,同时还要考虑是否有一个空捕获组,因为我希望每行填充所有字段。
行示例:在此示例中,地址 4、县和联系人姓名为空。您还可以看到一些错误/不正确的值。 我还需要删除一些初始/结束文本。
x <- "Please enter an UT location before booking the order.. ADDRESS_VALIDATION_FAILED (SITE_TYPE=uct) (SITE_USE_ID=1000) (CUSTOMER_NAME=cname) (CUSTOMER_NUMBER=2000) (ADDRESS1=addy1) (ADDRESS2=addy2) (ADDRESS3=addy3) (ADDRESS4=) (CITY=.) (STATE=) (ZIP=0000) (COUNTY=) (COUNTRY=NO) (CONTACT_NAME=) The task is raised for line_number: 7"
但是在 R 中,当我尝试使用 tidyr 的单独方法时,我最终会得到不希望的结果。我不是在逃避它吗?
这是我的代码:
df.sub <- separate(data = main.data, col = Order.Task.Text.CCW, into = c("SITE_TYPE", "SITE_USE_ID", "CUSTOMER_NAME","CUSTOMER_NUMBER", "ADDRESS1", "ADDRESS2", "ADDRESS3", "ADDRESS4", "CITY", "STATE", "ZIP", "COUNTY", "COUNTRY", "CONTACT_NAME"), sep = "=([^\\)]+|())\\)")
结果示例:
SITE_TYPE SITE_USE_ID CUSTOMER_NAME CUSTOMER_NUMBER
1 (SITE_TYPE (SITE_USE_ID (CUSTOMER_NAME (CUSTOMER_NUMBER
2 (SITE_TYPE (SITE_USE_ID (CUSTOMER_NAME (CUSTOMER_NUMBER
3 (SITE_TYPE (SITE_USE_ID (CUSTOMER_NAME (CUSTOMER_NUMBER
4 (SITE_TYPE (SITE_USE_ID (CUSTOMER_NAME (CUSTOMER_NUMBER
最终解决方案
这是我为任何好奇的人提供的最终解决方案,基于为便于查看而格式化的正确答案。
p <- proto(
pre = function(.) .$k <- 0,
fun = function(., x) {
if (x == "(") .$k <- .$k + 1 else if (x == ")") .$k <- .$k - 1
if (x == "(" && .$k == 1) "" else if (x == ")" && .$k == 0) "\n" else x
})
df.sub.final <- df.sub$text %>%
sub("^[^\\(]*\\(", "(", .) %>%
sub("\\)[^\\)]*$", ")", .) %>%
gsub("\n", "", .) %>%
gsub("=", ": ", .) %>%
gsubfn("([\\(\\)]) *", p, .) %>%
textConnection %>%
read.dcf %>%
as.data.frame(.)
【问题讨论】:
-
尽量使用正面的lookhead和正面的look back。 (?
-
说错误:'\=' 是从 ""(? 开始的字符串中无法识别的转义
-
(?
-
No 没用,抱怨 ) 你有。我尝试将 \\ 添加到 all 但它没有提供所需的输出,而是看起来像:) (SITE_USE_ID= 用于 SITE_USE_ID 字段。我认为堆栈溢出可能还需要你转义你的 \'s 可能吗?
-
试试
"\\(\\w+=|\\)\\s*",但我相信它可能会产生一些空值。