社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
私信  •  关注

James Mchugh

James Mchugh 最近创建的主题
James Mchugh 最近回复了
6 年前
回复了 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)指的是第一个字符?

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