Computers compare text character by character, so any difference at all makes 2 strings unequal.
People ignore spaces, capitals and accents when they read, which is why these differences go unnoticed.
Normalisation removes the differences that carry no meaning, before any join, count or deduplication.
Trimming removes spaces at the start and end, which often come from copying out of spreadsheets or forms.
Case folding makes every letter the same case, so London and LONDON compare as equal.
Collapsing runs of spaces inside the text means a name typed with a double space matches the normal one.
Invisible characters, such as non-breaking spaces, look like ordinary spaces but need removing separately.
Unicode, the standard computers use to store text, can write an accented letter as one character or as a letter plus a mark.
Unicode normalisation picks one of those forms, so both versions of café become identical.
Punctuation is a judgement call: removing full stops helps U.K. match UK, but removing every hyphen may merge distinct codes.
Normalisation can also go too far, since some codes are case sensitive and lowercasing them merges different values.
It is usually better to keep the original column and add a normalised one used only for matching.
In pandas, the str methods strip, lower and replace handle most steps across a whole column at once.
After normalising, a fresh value_counts often shows far fewer distinct values than before.
The common misconception is that normalisation fixes meaning, when it only fixes form, so variants like NYC still need a mapping.