私信  •  关注

James Mchugh

James Mchugh 最近创建的主题
James Mchugh 最近回复了
5 年前
回复了 James Mchugh 创建的主题 » 此python代码如何使用regex sub()和group()将字符串转换为camelCase?

所以要理解这段代码,您必须理解一点正则表达式和一点 re Python module . 我们先看看 re.sub 做。从文档来看,函数的签名如下

re.sub(pattern, repl, string, count=0, flags=0)

重要的是 pattern , repl ,和 string 参数。

  • 图案 是要替换的正则表达式模式
  • 回复 是要将匹配的模式替换为的,可以是以匹配对象作为参数的字符串或函数
  • 一串 是要替换的字符串

函数用于查找 一串 符合正则表达式的 图案 ,并将这些部分替换为 回复 .

现在让我们进入使用的正则表达式: [_-](.) .

  • [_-] 匹配方括号中的任何字符( _ - )
  • . 匹配任何字符
  • (.) 捕获 capture group

现在让我们把这一切放在一起。完整的模式将匹配两个字符。第一个字符将是 _ - 第二个角色可以是任何东西。实际上,以下字符串的粗体部分将被匹配。

  • _t型 世界
  • 测试 _3个
  • 游牧-
  • 这个遗嘱 _米 阿奇
  • 正常人_
  • 需要 _米 矿石 _c类 创造性的 _e类 示例-

重要的是 (.) regex的一部分匹配任何字符并将其存储在捕获组中,这允许我们在 回复 部分论点。

我们来看看 回复 就在这里。在这种情况下, 回复 是一个 lambda function .

lambda x: x.group(1).upper()

lambda与普通的Python函数没有太大区别。在冒号之前定义参数,然后在冒号之后定义返回表达式。上面的羔羊 x 作为一个论点,它假设 是一个 match object . 匹配对象具有 group 方法,该方法允许您引用与regex模式匹配的组(请记住 (.) 从以前开始?)。它获取匹配的第一组,并使用 str 对象的内置 upper 方法。然后它返回大写的字符串,这就是替换匹配的 图案 .

现在一起:

import re
def to_camel_case(text):
    return re.sub('[_-](.)', lambda x: x.group(1).upper(), text)

这个 图案 [_-](.) 它匹配任何下划线或破折号后跟任何字符。使用 回复 lambda函数。部分 一串 然后将匹配该模式的字符替换为大写字符。

最后,我认为以上回答了您的大部分问题,但总结一下:

我查找了re.sub()和group(),但仍然无法将其组合在一起。我不知道怎么做 [_-](.) 工作,为什么 [_-](w+) 不起作用?

我想你是想用 \w 字符集,而不是 w . 这个 \西 字符集匹配所有字母数字字符和下划线。如果 + 未使用运算符。这个 + 贪婪地匹配字符,因此它将导致属于 \西 设置要捕获的下划线或连字符后面的内容。这会导致两个问题:它将所有捕获的字符(可能是一个完整的单词)大写,并捕获下划线,导致以后的下划线无法正确替换。

他是怎么学会用sub连字符和下划线的?

赋予 回复 只返回第一个捕获组的大写版本。在模式中 [-_](.) ,只捕获连字符或下划线后面的字符。实际上,模式 [-_](.) 匹配并替换为大写字符 (.) . 这就是连字符/下划线被删除的原因。

是否成功地将每个单词的第一个字符(第一个单词除外)大写? 我以为x.group(1).upper()会将整个单词大写,为什么group(1)指的是第一个字符?

捕获组只匹配下划线或连字符后面的第一个字符,因此这是大写的。