Error: undeclared field: 'captures' for type nre.RegexMatch

Error: undeclared field: 'captures' for type 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(有效的)示例代码几乎相同。

好像是进口的。它适用于 import nre 而不是 from nre import findIter, re。但为什么?我想保持我的命名空间干净!

导入整个模块在 Nim 中是惯用的,并且由于强大的类型系统而很少导致歧义。请参阅 https://narimiran.github.io/2019/07/01/nim-import.html 了解 Nim 为何不分享 Python 的导入问题的详细说明。

然而,这里是如何做你想做的,即使它不是惯用的 Nim:

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

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))