 李欣宜 扩展Python的语法和语义Python的语法扩展系统 Moshmosh Thautwarm&李欣宜 The awareness of low-level implementation details brings the appreciation of an abstraction and the intuitive explanation for it. — Oleg Kiselyov Kiselyov 目录 CONTENTS 提供语法和语义的语言不仅仅是工具, 还是思维方式 表达能力的极限,由内破除, 还是从外破除? Moshmosh: 我的Python不可能这么甜美清新 下班时在干什么?有没有空?可以来contribute吗? 1 提供语法和语义的语言 不仅仅是工具, 还是思维方式 “语言只是工具”是现代社会最为荒谬的说法之一。 即便存在海量的常见任务,他们在部分语言里很容 make sense却没有支持。 就说Python。Python是有极限的,只从语义语法上讲。 和性能、GIL相关的问题我们放在一边。 1. 没有多行lambda 2. 作用域管理规则/name shadow(let-binding) 3. 表达式和语句区分,表达式内部不能包含语句 4. 没有语法宏,代码操作不够自动 5. 没有variant类型(只能靠一大堆抽象类和继承去workaround)0 码力 | 39 页 | 3.69 MB | 1 年前3 李欣宜 扩展Python的语法和语义Python的语法扩展系统 Moshmosh Thautwarm&李欣宜 The awareness of low-level implementation details brings the appreciation of an abstraction and the intuitive explanation for it. — Oleg Kiselyov Kiselyov 目录 CONTENTS 提供语法和语义的语言不仅仅是工具, 还是思维方式 表达能力的极限,由内破除, 还是从外破除? Moshmosh: 我的Python不可能这么甜美清新 下班时在干什么?有没有空?可以来contribute吗? 1 提供语法和语义的语言 不仅仅是工具, 还是思维方式 “语言只是工具”是现代社会最为荒谬的说法之一。 即便存在海量的常见任务,他们在部分语言里很容 make sense却没有支持。 就说Python。Python是有极限的,只从语义语法上讲。 和性能、GIL相关的问题我们放在一边。 1. 没有多行lambda 2. 作用域管理规则/name shadow(let-binding) 3. 表达式和语句区分,表达式内部不能包含语句 4. 没有语法宏,代码操作不够自动 5. 没有variant类型(只能靠一大堆抽象类和继承去workaround)0 码力 | 39 页 | 3.69 MB | 1 年前3
 4 Python语法扩展框架Moshmosh和其上的CPython compatible JIT实现 thautwarm0 码力 | 30 页 | 8.04 MB | 1 年前3 4 Python语法扩展框架Moshmosh和其上的CPython compatible JIT实现 thautwarm0 码力 | 30 页 | 8.04 MB | 1 年前3
 3 Thautwarm 解放python的表达力 性能和安全性 语法和语义扩展 JIT 静态检查解放Python的 表达力,性能和安全性 Thautwarm 目录 CONTENTS 语法和语义扩展 JIT 静态类型 语法和语义扩展 表达力的扩展, 可用性的保留,白来的午餐? 演示一小部分: 模式匹配, Quick Lambda, Pipe运算 语言决定思维模型 GNU-APL C++ Haskell 说 到 质 数 � 人 们 想 到 什 么 � 语言决定思维模型 语言决定思维模型 在 实 际 业 务 中 处 理 数 据 � Python 语言决定思维模型 语言中的语法和语义, 决定了 它真实的表达力。 大多数语言都不是“万金油” 的,这是客观事实。 但它们不够“万金油”的问题 来源,不一定是不能解决的。 扩展语言,开阔思维 我预期的语法(及语义) 扩展系统: 1. 首行用moshmosh? 标志模块 2. +extension名 (extension参数)开 只对源代码Loader 重写get_data方法 调用父get_data方法, 拿到源代码 moshmosh.extension. perform_extension 源码变换 扩展的语法和语义 并非naïve的,不卫生的 源码变换; 其作用是对 AST实现一层quote moshmosh/extension_register.py (只有45行) 科普: Python Import机制是怎样的?0 码力 | 43 页 | 10.71 MB | 1 年前3 3 Thautwarm 解放python的表达力 性能和安全性 语法和语义扩展 JIT 静态检查解放Python的 表达力,性能和安全性 Thautwarm 目录 CONTENTS 语法和语义扩展 JIT 静态类型 语法和语义扩展 表达力的扩展, 可用性的保留,白来的午餐? 演示一小部分: 模式匹配, Quick Lambda, Pipe运算 语言决定思维模型 GNU-APL C++ Haskell 说 到 质 数 � 人 们 想 到 什 么 � 语言决定思维模型 语言决定思维模型 在 实 际 业 务 中 处 理 数 据 � Python 语言决定思维模型 语言中的语法和语义, 决定了 它真实的表达力。 大多数语言都不是“万金油” 的,这是客观事实。 但它们不够“万金油”的问题 来源,不一定是不能解决的。 扩展语言,开阔思维 我预期的语法(及语义) 扩展系统: 1. 首行用moshmosh? 标志模块 2. +extension名 (extension参数)开 只对源代码Loader 重写get_data方法 调用父get_data方法, 拿到源代码 moshmosh.extension. perform_extension 源码变换 扩展的语法和语义 并非naïve的,不卫生的 源码变换; 其作用是对 AST实现一层quote moshmosh/extension_register.py (只有45行) 科普: Python Import机制是怎样的?0 码力 | 43 页 | 10.71 MB | 1 年前3
 理解Python中的AST 何翔宇 transform A transform B bytecode emit source code: ⽂文本形式的 Python 源码 parser tree: 保留留具体语法信息的树 AST: 对语法的⾼高度抽象,不不会保留留细节 CFG: 记录着程序流程的有向图 bytecode: 能够被 Python 解释器器使⽤用的源码 Intro CPython’s Compiler as the default source encoding - PEP 3131 -- Supporting Non-ASCII Identifiers - 解析 - 根据词法分析的结果和语法⽂文件,⽣生成解析树 - 分词器器(Tokenize) - keyword - tokenize Intro CPython’s Compiler - transform and emit AST Library 什什么是抽象语法树? 在计算机科学中,抽象语法树(Abstract Syntax Tree,AST),或简称语法树 (Syntax tree),是源代码语法结构的⼀一种抽象表示。它以树状的形式表现编程语⾔言 的语法结构,树上的每个节点都表示源代码中的⼀一种结构。之所以说语法是“抽象” 的,是因为这⾥里里的语法并不不会表示出真实语法中出现的每个细节。 How to Use0 码力 | 39 页 | 6.95 MB | 1 年前3 理解Python中的AST 何翔宇 transform A transform B bytecode emit source code: ⽂文本形式的 Python 源码 parser tree: 保留留具体语法信息的树 AST: 对语法的⾼高度抽象,不不会保留留细节 CFG: 记录着程序流程的有向图 bytecode: 能够被 Python 解释器器使⽤用的源码 Intro CPython’s Compiler as the default source encoding - PEP 3131 -- Supporting Non-ASCII Identifiers - 解析 - 根据词法分析的结果和语法⽂文件,⽣生成解析树 - 分词器器(Tokenize) - keyword - tokenize Intro CPython’s Compiler - transform and emit AST Library 什什么是抽象语法树? 在计算机科学中,抽象语法树(Abstract Syntax Tree,AST),或简称语法树 (Syntax tree),是源代码语法结构的⼀一种抽象表示。它以树状的形式表现编程语⾔言 的语法结构,树上的每个节点都表示源代码中的⼀一种结构。之所以说语法是“抽象” 的,是因为这⾥里里的语法并不不会表示出真实语法中出现的每个细节。 How to Use0 码力 | 39 页 | 6.95 MB | 1 年前3
 Python 3.9.20 正则表达式 HOWTO 定义,可以在编译正则 表达式时添加 re.ASCII 标志。 以下为特殊序列的不完全列表。如果需要完整的序列列表,以及 Unicode 字符串 pattern 的扩展类定义,请参 阅标准库参考中 正则表达式语法的最后一部分。一般来说,Unicode 版本的字符类会匹配 Unicode 数据库中 属于相应类别的任何字符。 \d 匹配任何十进制数字,等价于字符类 [0-9] 。 \D 匹配任何非数字字符,等价于字符类 flags 参数,用于启用各种特殊功能和语法变体。我们稍后将介绍可用的 设置,但现在先举一个简单的例子 >>> p = re.compile('ab*', re.IGNORECASE) 在这个例子中,正则以字符串形式传递给了 re.compile() 。之所将正则作为字符串处理,是因为正则表 达式并非 Python 语言的核心组成部分,也没有为其创建专门的语法。(有些应用程序根本不需要正则,因此 此外,某些在正则表达式中有效,但在 Python 普通字符串字面量中无效的特殊转义序列,现在会引发导致 DeprecationWarning (弃用警告) ,并且在未来可能会变为一个 SyntaxError (语法错误) 。这意味着, 如果没有使用原始字符串就直接书写正则本身,这种特殊序列将变得无效。 普通字符串 原始字符串 "ab*" r"ab*" "\\\\section" r"\\section"0 码力 | 18 页 | 400.78 KB | 11 月前3 Python 3.9.20 正则表达式 HOWTO 定义,可以在编译正则 表达式时添加 re.ASCII 标志。 以下为特殊序列的不完全列表。如果需要完整的序列列表,以及 Unicode 字符串 pattern 的扩展类定义,请参 阅标准库参考中 正则表达式语法的最后一部分。一般来说,Unicode 版本的字符类会匹配 Unicode 数据库中 属于相应类别的任何字符。 \d 匹配任何十进制数字,等价于字符类 [0-9] 。 \D 匹配任何非数字字符,等价于字符类 flags 参数,用于启用各种特殊功能和语法变体。我们稍后将介绍可用的 设置,但现在先举一个简单的例子 >>> p = re.compile('ab*', re.IGNORECASE) 在这个例子中,正则以字符串形式传递给了 re.compile() 。之所将正则作为字符串处理,是因为正则表 达式并非 Python 语言的核心组成部分,也没有为其创建专门的语法。(有些应用程序根本不需要正则,因此 此外,某些在正则表达式中有效,但在 Python 普通字符串字面量中无效的特殊转义序列,现在会引发导致 DeprecationWarning (弃用警告) ,并且在未来可能会变为一个 SyntaxError (语法错误) 。这意味着, 如果没有使用原始字符串就直接书写正则本身,这种特殊序列将变得无效。 普通字符串 原始字符串 "ab*" r"ab*" "\\\\section" r"\\section"0 码力 | 18 页 | 400.78 KB | 11 月前3
 Python 3.10.15 正则表达式 HOWTO ASCII 标志,可以在 str 表达式中使用较为狭窄的 \w 定义。 以下为特殊序列的不完全列表。有关 Unicode 字符串正则表达式的序列和扩展类定义的完整列表,参见标准 库参考中 正则表达式语法的最后一部分。通常,Unicode 版本的字符类会匹配 Unicode 数据库的相应类别中 的任何字符。 \d 匹配任何十进制数字,等价于字符类 [0-9] 。 \D 匹配任何非数字字符,等价于字符类 也接受一个可选的 flags 参数,用于启用各种特殊功能和语法变体。我们稍后将介绍可用的 设置,但现在只需一个例子 >>> p = re.compile('ab*', re.IGNORECASE) 正则作为字符串传递给 re.compile() 。正则被处理为字符串,因为正则表达式不是核心 Python 语言的一 部分,并且没有创建用于表达它们的特殊语法。(有些应用程序根本不需要正则,因此不需要通过包含它们 11 4.3 非捕获和命名组 精心设计的正则可以使用许多组,既可以捕获感兴趣的子串,也可以对正则本身进行分组和构建。在复杂的 正则中,很难跟踪组号。有两个功能可以帮助解决这个问题。它们都使用常用语法进行正则表达式扩展,因 此我们首先看一下。 Perl 5 以其对标准正则表达式的强大补充而闻名。对于这些新功能,Perl 开发人员无法选择新的单键击元字 符或以 \ 开头的新特殊序列,否则 Perl0 码力 | 18 页 | 391.85 KB | 11 月前3 Python 3.10.15 正则表达式 HOWTO ASCII 标志,可以在 str 表达式中使用较为狭窄的 \w 定义。 以下为特殊序列的不完全列表。有关 Unicode 字符串正则表达式的序列和扩展类定义的完整列表,参见标准 库参考中 正则表达式语法的最后一部分。通常,Unicode 版本的字符类会匹配 Unicode 数据库的相应类别中 的任何字符。 \d 匹配任何十进制数字,等价于字符类 [0-9] 。 \D 匹配任何非数字字符,等价于字符类 也接受一个可选的 flags 参数,用于启用各种特殊功能和语法变体。我们稍后将介绍可用的 设置,但现在只需一个例子 >>> p = re.compile('ab*', re.IGNORECASE) 正则作为字符串传递给 re.compile() 。正则被处理为字符串,因为正则表达式不是核心 Python 语言的一 部分,并且没有创建用于表达它们的特殊语法。(有些应用程序根本不需要正则,因此不需要通过包含它们 11 4.3 非捕获和命名组 精心设计的正则可以使用许多组,既可以捕获感兴趣的子串,也可以对正则本身进行分组和构建。在复杂的 正则中,很难跟踪组号。有两个功能可以帮助解决这个问题。它们都使用常用语法进行正则表达式扩展,因 此我们首先看一下。 Perl 5 以其对标准正则表达式的强大补充而闻名。对于这些新功能,Perl 开发人员无法选择新的单键击元字 符或以 \ 开头的新特殊序列,否则 Perl0 码力 | 18 页 | 391.85 KB | 11 月前3
 Python 3.8.20 正则表达式 HOWTO ASCII 标志,可以在 str 表达式中使用较为狭窄的 \w 定义。 以下为特殊序列的不完全列表。有关 Unicode 字符串正则表达式的序列和扩展类定义的完整列表,参见标准 库参考中 正则表达式语法的最后一部分。通常,Unicode 版本的字符类会匹配 Unicode 数据库的相应类别中 的任何字符。 \d 匹配任何十进制数字,等价于字符类 [0-9] 。 \D 匹配任何非数字字符,等价于字符类 也接受一个可选的 flags 参数,用于启用各种特殊功能和语法变体。我们稍后将介绍可用的 设置,但现在只需一个例子 >>> p = re.compile('ab*', re.IGNORECASE) 正则作为字符串传递给 re.compile() 。正则被处理为字符串,因为正则表达式不是核心 Python 语言的一 部分,并且没有创建用于表达它们的特殊语法。(有些应用程序根本不需要正则,因此不需要通过包含它们 11 4.3 非捕获和命名组 精心设计的正则可以使用许多组,既可以捕获感兴趣的子串,也可以对正则本身进行分组和构建。在复杂的 正则中,很难跟踪组号。有两个功能可以帮助解决这个问题。它们都使用常用语法进行正则表达式扩展,因 此我们首先看一下。 Perl 5 以其对标准正则表达式的强大补充而闻名。对于这些新功能,Perl 开发人员无法选择新的单键击元字 符或以 \ 开头的新特殊序列,否则 Perl0 码力 | 18 页 | 392.29 KB | 11 月前3 Python 3.8.20 正则表达式 HOWTO ASCII 标志,可以在 str 表达式中使用较为狭窄的 \w 定义。 以下为特殊序列的不完全列表。有关 Unicode 字符串正则表达式的序列和扩展类定义的完整列表,参见标准 库参考中 正则表达式语法的最后一部分。通常,Unicode 版本的字符类会匹配 Unicode 数据库的相应类别中 的任何字符。 \d 匹配任何十进制数字,等价于字符类 [0-9] 。 \D 匹配任何非数字字符,等价于字符类 也接受一个可选的 flags 参数,用于启用各种特殊功能和语法变体。我们稍后将介绍可用的 设置,但现在只需一个例子 >>> p = re.compile('ab*', re.IGNORECASE) 正则作为字符串传递给 re.compile() 。正则被处理为字符串,因为正则表达式不是核心 Python 语言的一 部分,并且没有创建用于表达它们的特殊语法。(有些应用程序根本不需要正则,因此不需要通过包含它们 11 4.3 非捕获和命名组 精心设计的正则可以使用许多组,既可以捕获感兴趣的子串,也可以对正则本身进行分组和构建。在复杂的 正则中,很难跟踪组号。有两个功能可以帮助解决这个问题。它们都使用常用语法进行正则表达式扩展,因 此我们首先看一下。 Perl 5 以其对标准正则表达式的强大补充而闻名。对于这些新功能,Perl 开发人员无法选择新的单键击元字 符或以 \ 开头的新特殊序列,否则 Perl0 码力 | 18 页 | 392.29 KB | 11 月前3
 Python 3.12 正则表达式 HOWTO ASCII 标志,可以在 str 表达式中使用较为狭 窄的 \w 定义。 以下为特殊序列的不完全列表。有关 Unicode 字符串正则表达式的序列和扩展类定义的完整列表,参见 标准库参考中 正则表达式语法的最后一部分。通常,Unicode 版本的字符类会匹配 Unicode 数据库的相应 类别中的任何字符。 \d 匹配任何十进制数字,等价于字符类 [0-9] 。 \D 匹配任何非数字字符,等价于字符类 也接受一个可选的 flags 参数,用于启用各种特殊功能和语法变体。我们稍后将介绍可用 的设置,但现在只需一个例子 >>> p = re.compile('ab*', re.IGNORECASE) 正则作为字符串传递给 re.compile() 。正则被处理为字符串,因为正则表达式不是核心 Python 语言的 一部分,并且没有创建用于表达它们的特殊语法。(有些应用程序根本不需要正则,因此不需要通过包含 非常有用。 4.3 非捕获和命名组 精心设计的正则可以使用许多组,既可以捕获感兴趣的子串,也可以对正则本身进行分组和构建。在复 杂的正则中,很难跟踪组号。有两个功能可以帮助解决这个问题。它们都使用常用语法进行正则表达式 扩展,因此我们首先看一下。 Perl 5 以其对标准正则表达式的强大补充而闻名。对于这些新功能,Perl 开发人员无法选择新的单键击元 字符或以 \ 开头的新特殊序列,否则 Perl0 码力 | 17 页 | 404.43 KB | 11 月前3 Python 3.12 正则表达式 HOWTO ASCII 标志,可以在 str 表达式中使用较为狭 窄的 \w 定义。 以下为特殊序列的不完全列表。有关 Unicode 字符串正则表达式的序列和扩展类定义的完整列表,参见 标准库参考中 正则表达式语法的最后一部分。通常,Unicode 版本的字符类会匹配 Unicode 数据库的相应 类别中的任何字符。 \d 匹配任何十进制数字,等价于字符类 [0-9] 。 \D 匹配任何非数字字符,等价于字符类 也接受一个可选的 flags 参数,用于启用各种特殊功能和语法变体。我们稍后将介绍可用 的设置,但现在只需一个例子 >>> p = re.compile('ab*', re.IGNORECASE) 正则作为字符串传递给 re.compile() 。正则被处理为字符串,因为正则表达式不是核心 Python 语言的 一部分,并且没有创建用于表达它们的特殊语法。(有些应用程序根本不需要正则,因此不需要通过包含 非常有用。 4.3 非捕获和命名组 精心设计的正则可以使用许多组,既可以捕获感兴趣的子串,也可以对正则本身进行分组和构建。在复 杂的正则中,很难跟踪组号。有两个功能可以帮助解决这个问题。它们都使用常用语法进行正则表达式 扩展,因此我们首先看一下。 Perl 5 以其对标准正则表达式的强大补充而闻名。对于这些新功能,Perl 开发人员无法选择新的单键击元 字符或以 \ 开头的新特殊序列,否则 Perl0 码力 | 17 页 | 404.43 KB | 11 月前3
 Python 3.12 正则表达式 HOWTO ASCII 标志,可以在 str 表达式中使用较为狭 窄的 \w 定义。 以下为特殊序列的不完全列表。有关 Unicode 字符串正则表达式的序列和扩展类定义的完整列表,参见 标准库参考中 正则表达式语法的最后一部分。通常,Unicode 版本的字符类会匹配 Unicode 数据库的相应 类别中的任何字符。 \d 匹配任何十进制数字,等价于字符类 [0-9] 。 \D 匹配任何非数字字符,等价于字符类 也接受一个可选的 flags 参数,用于启用各种特殊功能和语法变体。我们稍后将介绍可用 的设置,但现在只需一个例子 >>> p = re.compile('ab*', re.IGNORECASE) 正则作为字符串传递给 re.compile() 。正则被处理为字符串,因为正则表达式不是核心 Python 语言的 一部分,并且没有创建用于表达它们的特殊语法。(有些应用程序根本不需要正则,因此不需要通过包含 非常有用。 4.3 非捕获和命名组 精心设计的正则可以使用许多组,既可以捕获感兴趣的子串,也可以对正则本身进行分组和构建。在复 杂的正则中,很难跟踪组号。有两个功能可以帮助解决这个问题。它们都使用常用语法进行正则表达式 扩展,因此我们首先看一下。 Perl 5 以其对标准正则表达式的强大补充而闻名。对于这些新功能,Perl 开发人员无法选择新的单键击元 字符或以 \ 开头的新特殊序列,否则 Perl0 码力 | 17 页 | 404.43 KB | 11 月前3 Python 3.12 正则表达式 HOWTO ASCII 标志,可以在 str 表达式中使用较为狭 窄的 \w 定义。 以下为特殊序列的不完全列表。有关 Unicode 字符串正则表达式的序列和扩展类定义的完整列表,参见 标准库参考中 正则表达式语法的最后一部分。通常,Unicode 版本的字符类会匹配 Unicode 数据库的相应 类别中的任何字符。 \d 匹配任何十进制数字,等价于字符类 [0-9] 。 \D 匹配任何非数字字符,等价于字符类 也接受一个可选的 flags 参数,用于启用各种特殊功能和语法变体。我们稍后将介绍可用 的设置,但现在只需一个例子 >>> p = re.compile('ab*', re.IGNORECASE) 正则作为字符串传递给 re.compile() 。正则被处理为字符串,因为正则表达式不是核心 Python 语言的 一部分,并且没有创建用于表达它们的特殊语法。(有些应用程序根本不需要正则,因此不需要通过包含 非常有用。 4.3 非捕获和命名组 精心设计的正则可以使用许多组,既可以捕获感兴趣的子串,也可以对正则本身进行分组和构建。在复 杂的正则中,很难跟踪组号。有两个功能可以帮助解决这个问题。它们都使用常用语法进行正则表达式 扩展,因此我们首先看一下。 Perl 5 以其对标准正则表达式的强大补充而闻名。对于这些新功能,Perl 开发人员无法选择新的单键击元 字符或以 \ 开头的新特殊序列,否则 Perl0 码力 | 17 页 | 404.43 KB | 11 月前3
 Python 3.13 正则表达式 HOWTO ASCII 标志,可以在 str 表达式中使用较为狭 窄的 \w 定义。 以下为特殊序列的不完全列表。有关 Unicode 字符串正则表达式的序列和扩展类定义的完整列表,参见 标准库参考中 正则表达式语法的最后一部分。通常,Unicode 版本的字符类会匹配 Unicode 数据库的相应 类别中的任何字符。 \d 匹配任何十进制数字,等价于字符类 [0-9] 。 \D 匹配任何非数字字符,等价于字符类 也接受一个可选的 flags 参数,用于启用各种特殊功能和语法变体。我们稍后将介绍可用 的设置,但现在只需一个例子 >>> p = re.compile('ab*', re.IGNORECASE) 正则作为字符串传递给 re.compile() 。正则被处理为字符串,因为正则表达式不是核心 Python 语言的 一部分,并且没有创建用于表达它们的特殊语法。(有些应用程序根本不需要正则,因此不需要通过包含 非常有用。 4.3 非捕获和命名组 精心设计的正则可以使用许多组,既可以捕获感兴趣的子串,也可以对正则本身进行分组和构建。在复 杂的正则中,很难跟踪组号。有两个功能可以帮助解决这个问题。它们都使用常用语法进行正则表达式 扩展,因此我们首先看一下。 Perl 5 以其对标准正则表达式的强大补充而闻名。对于这些新功能,Perl 开发人员无法选择新的单键击元 字符或以 \ 开头的新特殊序列,否则 Perl0 码力 | 17 页 | 403.17 KB | 11 月前3 Python 3.13 正则表达式 HOWTO ASCII 标志,可以在 str 表达式中使用较为狭 窄的 \w 定义。 以下为特殊序列的不完全列表。有关 Unicode 字符串正则表达式的序列和扩展类定义的完整列表,参见 标准库参考中 正则表达式语法的最后一部分。通常,Unicode 版本的字符类会匹配 Unicode 数据库的相应 类别中的任何字符。 \d 匹配任何十进制数字,等价于字符类 [0-9] 。 \D 匹配任何非数字字符,等价于字符类 也接受一个可选的 flags 参数,用于启用各种特殊功能和语法变体。我们稍后将介绍可用 的设置,但现在只需一个例子 >>> p = re.compile('ab*', re.IGNORECASE) 正则作为字符串传递给 re.compile() 。正则被处理为字符串,因为正则表达式不是核心 Python 语言的 一部分,并且没有创建用于表达它们的特殊语法。(有些应用程序根本不需要正则,因此不需要通过包含 非常有用。 4.3 非捕获和命名组 精心设计的正则可以使用许多组,既可以捕获感兴趣的子串,也可以对正则本身进行分组和构建。在复 杂的正则中,很难跟踪组号。有两个功能可以帮助解决这个问题。它们都使用常用语法进行正则表达式 扩展,因此我们首先看一下。 Perl 5 以其对标准正则表达式的强大补充而闻名。对于这些新功能,Perl 开发人员无法选择新的单键击元 字符或以 \ 开头的新特殊序列,否则 Perl0 码力 | 17 页 | 403.17 KB | 11 月前3
共 104 条
- 1
- 2
- 3
- 4
- 5
- 6
- 11














 
 