Possible approaches to iteration

I would like to understand semantics of with_items in ansible and compare this approach to map for example.

For example, let consider:

{{ ["1","2", "3"] | map('regex_replace', '^(.*)$', \1'some tail') tail }}

How to reach the same effect using with_items ?
And in general how does it work ? Where is the body of this loop ?
For example (got from some stack overflow thread):

In the case of 'set_fact' you should not see much difference, but in
most other cases map will always be faster, with_<lookup> executes the
task once per item, except when squashing, but that is magic reserved
to only a few plugins.

FYI the 'item's part is equivalent of loop: '{{ [ "four", "five",
"six"] | flatten(depth=1) }}', a closer representation to map would be
with_list.