gpt4 book ai didi

python - 全部大写的驼峰式字符串

转载 作者:行者123 更新时间:2023-12-02 01:48:29 27 4
gpt4 key购买 nike

我有一个包含数千个表和列的数据库。列名一致全部大写,例如预订流程已添加、预订日期时间、预订状态。我希望重命名列,使它们采用小驼峰式大小写,例如BOOKINGSTATUS -> booking_status

由于单词、空格或下划线之间的大小写没有变化,因此基本上不可能应用更传统的方法将字符串转换为不同的大小写(例如使用 R 的 snakecase 包)。我想知道是否可以对每个字符串应用某种英语词典查找并返回拆分。

以上面的 BOOKINGSTATUS 为例,返回结果可能是:boo_king_status、boo_king_stat_us 和 booking_status。指定单词的最小长度会很有用。如果最小值设置为 4 个字母,则此示例中将仅返回 booking_status(因为“boo”只有 3 个字母长,“us”只有 2 个字母长)

蛮力方法很可能在计算上过于昂贵,但想询问是否有一种相当有效的方法可以做到这一点。 Python 或 R 解决方案将受到欢迎。

最佳答案

这是一个草率的、暴力的、不完美的尝试。它几乎肯定会错过一些东西。其实更多的是关于过程的对话,希望大家能建立一个更好的“词典”。

首先,讨论一下这个“字典”:理想情况下它应该包含一个单词及其复数、*ing*ed 形式。我们将尝试用蛇形包裹 (_word_) 版本替换每个单词,因此我们将根据长度以相反的顺序进行。为了保持理智,我们可能应该删除太短的单词(andana),所以让我们从 stringr::单词(只是一个“用于练习字符串操作的示例字符向量”,不是一个好的开始)。

words <- stringr::words[ order(nchar(stringr::words), decreasing = TRUE) ]
# see words[nchar(words) < 4] for what we are removing here
words <- words[nchar(words) > 3]
Reduce(function(txt, ptn) gsub(ptn, paste0("_", ptn ,"_"), txt, perl = TRUE),
toupper(words), init = vec)
# [1] "_BOOK_ING_PROCESS__NOTE_ADDED" "_BOOK_ED_DATE__TIME_" "_BOOK_INGSTATUS"

这看起来确实很奇怪。我们可以注意到,我们向量中知道的一些单词在stringr::words中丢失了:

c("booking", "process", "status") %in% words
# [1] FALSE TRUE FALSE

我们可以扩充我们的列表:

words2 <- c(words, "booking", "booked", "status")
words2 <- words2[ order(nchar(words2), decreasing = TRUE) ]
Reduce(function(txt, ptn) gsub(ptn, paste0("_", ptn ,"_"), txt, perl = TRUE),
toupper(words2), init = vec)
# [1] "__BOOK_ING__PROCESS__NOTE_ADDED" "__BOOK_ED__DATE__TIME_" "__BOOK_ING__STATUS_"

这里的问题是,由于我们同时拥有 "booking""book",因此它总是会双重更改 "BOOKING" 。鉴于我的起步很幼稚,除了删除 "book" (顺便说一句,还有 "king")之外,我不知道还有什么简单的快速补丁。

words3 <- setdiff(words2, c("book", "king"))
Reduce(function(txt, ptn) gsub(ptn, paste0("_", ptn ,"_"), txt, perl = TRUE),
toupper(words3), init = vec)
# [1] "_BOOKING__PROCESS__NOTE_ADDED" "_BOOKED__DATE__TIME_" "_BOOKING__STATUS_"

从这里,我们可以删除前导/尾随和双_

gsub("__", "_",
gsub("^_|_$", "",
Reduce(function(txt, ptn) gsub(ptn, paste0("_", ptn ,"_"), txt, perl = TRUE),
toupper(words3), init = vec)))
# [1] "BOOKING_PROCESS_NOTE_ADDED" "BOOKED_DATE_TIME" "BOOKING_STATUS"

质量完全取决于从一本好的字典开始。如果您所有的 UPPERNOSPACEWORDS 都定义良好,那么也许您可以手动构建它。 (请注意,某些单词可能只是 self 隔离,因为前后都有一个已知单词(请注意,"added" 不在 words3 中,但它仍然被分解)。

关于python - 全部大写的驼峰式字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70621434/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com