【问题标题】:Julia implementation for converting string to snake_case/CamelCase用于将字符串转换为 snake_case/CamelCase 的 Julia 实现
【发布时间】:2021-11-30 18:01:05
【问题描述】:

我正在寻找python库https://pypi.org/project/stringcase/的实现 在朱莉娅。

我找到了以下软件包,但它们似乎都有些过时了:

是否有用于将字符串转换为 snake_caseCamelCase 等的最新 Julia 库?

编辑:我有以下用例:

我从使用 CamelCase 命名约定的 C# 框架收到 JSON,我将其加载到 DataFrame。 生成的 DataFrame 具有如下列名称:timeStampaskBestVolumeaskBest30MWPrice。我想将列名转换为 snake_case 命名约定,即

"timeStamp" => "time_stamp"
"askBestVolume" => "ask_best_volume"
"askBest30MWPrice" => "ask_best_30MW_price"
...

前两个示例相当简单,应该包含在基本的snake_case(name_in_camel_case::String) 函数中。第三个示例需要定义在转换中被忽略的“保留字”。

【问题讨论】:

  • StringCases.jl 有什么问题?
  • 我意识到,我的问题措辞不当。我对近年来缺乏活动感到沮丧,并想知道StringCases.jl 是否确实是正确使用的包,或者是否有其他方法可以做到这一点。
  • 也许您需要的示例将有助于确定 StringCases.jl 是否是您需要的。从您的问题来看,这确实是您所寻求的。
  • 当然,我添加了一个示例,希望对您有所帮助。

标签: python string julia


【解决方案1】:

这不使用问题中提到的“保留词”,而是假设一系列大写字母(以及前面的数字,如果有的话,例如“30MW”)应该是一个词它自己的;同时还确保“30MWPrice”中的“Price”被视为一个单独的词。


function snake_case(camelstring::S) where S<:AbstractString

  wordpat = r"
  ^[a-z]+ |                  #match initial lower case part
  [A-Z][a-z]+ |              #match Words Like This
  \d*([A-Z](?=[A-Z]|$))+ |   #match ABBREV 30MW 
  \d+                        #match 1234 (numbers without units)
  "x

  smartlower(word) = any(islowercase, word) ? lowercase(word) : word
  words = [smartlower(m.match) for m in eachmatch(wordpat, camelstring)]

  join(words, "_")
end

using Test

function runtests()
  @test snake_case("askBest30MWPrice") == "ask_best_30MW_price"
  @test snake_case("welcomeToAIOverlords") == "welcome_to_AI_overlords"
  @test snake_case("queryInterface") == "query_interface"
  @test snake_case("tst") == "tst"
  @test snake_case("1234") == "1234"
  @test snake_case("column12Value") == "column_12_value"
  @test snake_case("readTOC") == "read_TOC"
end

(可能不重要)旁注:您可以将[a-z] 替换为[[:lower:]],并将[A-Z] 替换为上面的[[:upper:]],使其适用于更多语言,例如。然后snake_case("helloΩorld") 将返回"hello_ωorld"。但是(就像任何 Unicode 一样),存在细微差别 - 例如,我的语言(泰米尔语)没有字母大小写,因此它的字母不在 [:lower:][:upper:] 范围内。
使用\p{Lo}[:digit:] 和其他任何东西的适当Unicode 解决方案留给读者作为练习。

【讨论】:

  • 也许不重要但绝对有趣。为什么需要(?=[A-Z]|$) 部分?
  • [A-Z] 是必要的,以确保我们不匹配“30MWPrice”中的 P,即避免匹配实际上是下一个单词的一部分的大写字母。 |$ 是为了以防缩写出现在字符串的末尾,就像在 readTOC 中一样 - 我们也想匹配最后一个大写字母,因为那里没有“下一个单词”。
【解决方案2】:

你引用的python library中的snakecase函数如下所示:

def snakecase(string):
    string = re.sub(r"[\-\.\s]", '_', str(string))
    if not string:
        return string
    return lowercase(string[0]) + re.sub(r"[A-Z]", lambda matched: '_' + lowercase(matched.group(0)), string[1:])

snakecase("timeStamp") #time_stamp
snakecase("askBestVolume") #ask_best_volume
snakecase("askBest30MWPrice") #ask_best30_m_w_price

在 Julia 中的一种写法是:

function snakecase(string)
    string = replace(string, r"[\-\.\s]" => "_")
    words = lowercase.(split(string, r"(?=[A-Z])"))
    return join([i==1 ? word : "_$word" for (i,word) in enumerate(words)])
end

snakecase("timeStamp") #time_stamp
snakecase("askBestVolume") #ask_best_volume
snakecase("askBest30MWPrice") #ask_best30_m_w_price

但是请注意,“askBest30MWPrice”的处理方式不是您编写的(在任一函数中)

【讨论】:

    猜你喜欢
    • 2012-03-20
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    相关资源
    最近更新 更多