Idiomatic nimble_parsec

I am trying to implement a parser.

I want to parse a string that has the following format:

I did the following:

  sample =
    empty()
    |> ascii_string([?A..?Z, ?0..?9], 2)
    |> ascii_string([0..127], 4)
    |> ascii_string([0..127], 4)
    |> ignore(string("$"))

  defparsec :parse, sample

As much as I like it, something tells me that it can be cleaner / more consice.

Any ideas?