用于在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
- 现在与Python 2.7和3.5兼容,直到它们的各自EOL日期。
0.3.0 - 2019-09-30
- 修复了非尾部
$
的处理,例如在"^abc$|^def$"
中,两者都转换为 - 添加了针对
re.LOCALE
和re.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 查看哈希)
关闭
js-regex-1.0.1.tar.gz 的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | de27bbf11b135a9cc7b03fc35f586705e286d6cd4fbbe112eaa577ed1c82a69f |
|
MD5 | f38604d1adbd500c90c42599c04ac7e0 |
|
BLAKE2b-256 | 7ffa9d7fed60e855bf970de97f59586d0a45d7498dd27fbed946fa9d7633db94 |
关闭
js-regex-1.0.1-py3-none-any.whl 的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 08e4181bba68878bb2b29ff275f734a34ac2a4fed706977365d1aa527273e5a7 |
|
MD5 | 92e209b6aad365de8b24d6a23854ad54 |
|
BLAKE2b-256 | a888e47daf728197d8b06b6e8ba06c8dfbb1d5c409a24769d6575bf1a824dc8a |