Stop using regexes and use something like "strscans", pegs or a lexer generator:
https://nim-lang.org/docs/strscans.html
https://nim-lang.org/docs/parseutils.html
Since the re module and re procedure takes a raw string literal you can use fmt from strformat to do this:
import re, strformat
let
num = r"\d*"
wordNum = re(fmt"[a-z]\w*{num}")
wordNum2 = re"[a-z]\w*\d*"
echo find("hello123", wordNum)
echo find("hello123", wordNum2)
echo find(" hello123", wordNum)
echo find(" hello123", wordNum2)
Note that the num string needs to be a raw literal as well, or you'd have to escape the backslash.
To escape { or } you need to double it like {{ / }}.
It's explained in detail here.
import re, strformat
let
num = r"\d*"
wordNum = re(fmt"[a-z]\w*{num}{{")
echo find("hello123{", wordNum)
echo find(" hello123{", wordNum)