微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

错误:未声明的字段:类型为nre.RegexMatch的“捕获”

如何解决错误:未声明的字段:类型为nre.RegexMatch的“捕获”

我正在尝试将给定的字符串与nre匹配:

from nre import findIter,re

const sourceString = """
39
00:04:01,116 --> 00:04:01,783
Attrape.
"""
let srtRex = re"\d+\R\d+:\d+:\d+,\d+ --> \d+:\d+:\d+,\d+\R(\w+)"

for m in findIter(sourceString,srtRex,0):
  echo(m.captures[0])

虽然它无法编译,但以Error: undeclared field: 'captures' for type nre.RegexMatch [declared in /usr/local/Cellar/nim/1.2.6/nim/lib/impure/nre.nim(149,3)]失败。

这很奇怪,因为如果我执行echo(m),我会得到原始字符串,因此匹配本身可以正常工作。这是我无法访问的字段。这很奇怪,因为in this issue(有效)示例代码几乎相同。

解决方法

导入整个模块在Nim中是惯用的,由于强大的类型系统,很少导致歧义。有关Nim不分享Python导入问题的原因,请参见https://narimiran.github.io/2019/07/01/nim-import.html

但是,即使不是惯用的Nim,这也是您要执行的操作:

您不仅使用refindIter,还使用了过程captures[] proc,因此导入行需要为:

from nre import findIter,re,captures,`[]`

或者,为了完全分离名称空间,但是非常难看,您可以:

from nre import nil
let srtRex = nre.re"\d+\R\d+:\d+:\d+,\d+ --> \d+:\d+:\d+,\d+\R(\w+)"

for m in nre.findIter(sourceString,srtRex,0):
  echo(nre.`[]`(nre.captures(m),0))
,

似乎是进口货。它适用于import nre而不是from nre import findIter,re。但为什么?我想保持我的命名空间整洁!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。