Group PN(?P<PN>[A-Z\d-]+) +matches at least one character from the set below:
A-Zone character from A (6510) to Z (9010) (case sensitive)
\da Unicode decimal digit
-the literal - (4510 / 558 / 2D16)
\s+a Unicode whitespace character, repeated at least once
Group Name(?P<Name>[A-Z]+(?:[\s-]+[A-Z]+)*) +matches at least one character from the set below:
A-Zone character from A (6510) to Z (9010) (case sensitive)
Non-Capturing Group(?:[\s-]+[A-Z]+)* *repeats the group contents below any number of times:
+matches at least one character from the set below:
\sa Unicode whitespace character
-the literal - (4510 / 558 / 2D16)
+matches at least one character from the set below:
A-Zone character from A (6510) to Z (9010) (case sensitive)
\s+a Unicode whitespace character, repeated at least once
Negated Character Class[^,]+? +?matches at least one character outside the set below:
,the literal , (4410 / 548 / 2C16)
EAthe literal text EA (case sensitive) \s+a Unicode whitespace character, repeated at least once
Group Price(?P<Price>\d+(?:,\d+)*) \d+a Unicode decimal digit, repeated at least once
Non-Capturing Group(?:,\d+)* *repeats the group contents below any number of times:
,the literal , (4410 / 548 / 2C16)
\d+a Unicode decimal digit, repeated at least once
g modifier: global. Finds all matches instead of stopping after the first
m modifier: multiline. Causes ^ and $ to match the start and end of each line, not only the start and end of the string