跳转到主要内容

用于在Python中使用JavaScript正则表达式的薄兼容层

项目描述

js-regex

用于在Python中使用JavaScript正则表达式的兼容层。

你知道吗?正则表达式在不同的编程语言之间可能会有所不同。例如,考虑模式"^abc$",它匹配字符串"abc"。但字符串"abc\n"呢?它在Python中匹配,但在JavaScript中不匹配!

这些和其他细微差别对于跨语言标准(如jsonschema)来说非常重要,这就是为什么有js-regex的原因。

它是如何工作的

import re
import js_regex

re.compile("^abc$").search("abc\n")  # matches, unlike JS
js_regex.compile("^abc$").search("abc\n")  # does not match

内部,js_regex.compile()将具有不同含义的Python正则表达式语法替换为具有相同意图的任何Python正则表达式语法。

这只适用于.search()方法 - 对于JavaScript正则表达式没有等效的.match().fullmatch()

我们还检查了在Python中有效但在JavaScript中无效的构造(例如命名捕获组),并引发显式错误。在JavaScript中有效但在Python中无效的构造也可能引发错误,因为我们仍在底层使用Python的re.compile()函数!

以下表格改编自这个较大版本,省略了其他语言以及JS和Python有相同行为的任何行。

特性 JavaScript Python 处理
\a(铃音) 转换为JS行为
\ca-\cz\cA-\cZ(控制字符) 转换为JS行为
\d用于数字,\w用于单词字符,\s用于空白 ASCII Unicode 转换为JS行为(包括否定类\D\W\S
$(行或字符串末尾) 在末尾 允许尾部\n 转换为JS行为
\A(字符串开头) 显式错误,使用^代替
\Z(字符串末尾) 显式错误,使用$代替
(?<=text)(正向后视) 自ES2018开始出现 允许
(?<!text)(负向后视) 自ES2018开始出现 允许
(?(1)then|else) 显式错误
(?(group)then|else) 显式错误
(?#comment) 显式错误
(?P<name>regex)(Python命名捕获组) 尚未检测到
(?P=name)(Python命名反向引用) 尚未检测到
(?P<name>regex)(JavaScript命名捕获组) 自ES2018开始出现 来自Python的错误,尚未翻译
$<name>(JavaScript命名反向引用) 自ES2018开始出现 来自Python的错误,尚未翻译
(?i)(不区分大小写) /i 显式错误,用flags=re.IGNORECASE编译代替
(?m)^$在行中断处匹配) /m 显式错误,用flags=re.MULTILINE编译代替
(?s)(点匹配换行符) 显式错误,用flags=re.DOTALL编译代替
(?x)(自由间隔模式) 显式错误,JavaScript中没有相应的模式
非存在的组中的反向引用是一个错误 遵循Python行为
失败组的反向引用也失败 遵循Python行为
嵌套引用\1\9 遵循Python行为

请注意,在许多情况下,Python仅有的正则表达式功能会被JS正则表达式引擎视为普通模式的一部分。目前,我们在这样的输入上引发显式错误,但在未来的版本中可能将它们转换为具有JS行为。

变更日志

1.0.1 - 2019-10-17

  • 允许在Python 2上使用本地字符串。这实际上并不符合规范,但只会存在几个月,所以无所谓。

1.0.0 - 2019-10-04

  • 现在被认为功能完整且稳定,因为所有推荐用于jsonschema模式的构造都得到了支持,并且所有Python侧的不兼容性都被检测到。
  • 编译后的模式现在在Python 3上缓存,就像re.compile一样。

0.4.0 - 2019-10-03

0.3.0 - 2019-09-30

  • 修复了非尾部$的处理,例如在"^abc$|^def$"中,两者都转换为
  • 添加了针对re.LOCALEre.VERBOSE标志的显式错误,这些标志在JavaScript中没有等效项
  • 添加了对Python仅有的正则表达式功能使用的显式检查和错误

0.2.0 - 2019-09-28

尽可能将JS仅有的语法转换为Python等效语法。

0.1.0 - 2019-09-28

初始发布,包括项目设置和一个非常基本的实现。

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分发

js-regex-1.0.1.tar.gz (11.7 kB 查看哈希

上传于

构建分发

js_regex-1.0.1-py3-none-any.whl (12.1 kB 查看哈希)

上传于 Python 3

由...