Home › Blog › Clean a Messy CSV Before Cold Email (with the Role-Address Regex)
Every scraped or exported list arrives broken the same ways: SHOUTING names, trailing spaces, URL-shaped domains, three copies of the same person, and a layer of info@ addresses waiting to waste your verification credits. Here is the cleaning order that fixes all of it, the regex that filters role accounts, and when NOT to exclude them.

Clean in this order: structure → emails (lowercase, trim) → domains (bare, no URLs) → names (proper-case, no titles) → role/disposable filter → three-level dedupe → verification. The role regex covers info@, sales@, support@ and friends, but skip it for local-business lists where info@ IS the owner. The free CSV Cleaner runs the whole pass in your browser; verification credits only get spent on rows that survive.
1 STRUCTURE drop empties, fix delimiters/encoding
2 EMAILS lowercase, trim, strip gmail dots/+tags
3 DOMAINS https://www.acme.com/x → acme.com
4 NAMES "JOHN SMITH JR." → John Smith
strip Dr./PhD/emojis; flag garbage
5 FILTER role regex + disposable domains
(skip role filter for local-biz lists)
6 DEDUPE email exact → name+domain fuzzy →
company cap (3-4/domain, staggered)
7 VERIFY only what survived steps 1-6
ROLE REGEX (local part, case-insensitive):
^(info|contact|hello|sales|support|admin|office|
team|billing|accounts|hr|jobs|careers|help|
enquiries|inquiries|marketing|press|media|legal|
noreply|no-reply|postmaster|webmaster|abuse)@The role filter has one big carve-out: lists where the business IS the contact. On a Google Maps scrape of UK trades (like our UK SMB list), [email protected] is the owner reading their own mail, and deleting it deletes the lead. Run those lists with a reduced filter (drop only noreply, postmaster, abuse, webmaster), write copy addressed to the business rather than a merge-field first name, and give the segment its own campaign with the stricter 3% stop rule, the same isolation any different-risk segment earns.
Order matters because later steps depend on earlier ones: (1) structural fixes, drop empty rows, fix broken delimiters, normalize encoding so unicode junk does not defeat matching; (2) normalize emails, lowercase, trim, strip Gmail dots and plus tags; (3) normalize domains, extract the bare company domain from URL-shaped values (https://www.acme.com/about becomes acme.com); (4) fix names, proper-case SHOUTING and lowercase names, strip titles and emojis; (5) filter role addresses and disposables; (6) dedupe, email-level then person-level then company cap, which only works after normalization; (7) verify what survives. Cleaning after verifying wastes credits on rows you were going to delete.
Match the local part against the standard role list: ^(info|contact|hello|sales|support|admin|office|team|billing|accounts|hr|jobs|careers|help|enquiries|inquiries|marketing|press|media|legal|noreply|no-reply|postmaster|webmaster|abuse)@ (case-insensitive). That catches the overwhelming majority. Our free CSV Cleaner applies this list automatically alongside disposable-domain and syntax filtering, entirely in your browser, so nothing uploads anywhere.
Local and micro businesses, where info@ is genuinely the owner's working inbox and often the only address that exists. If your ICP is plumbers, restaurants, or single-location shops (Google Maps lists especially), blanket role filtering deletes your actual market. The rule: named-contact B2B lists get the full role filter; local-business lists keep info@ but still drop noreply@, postmaster@, and abuse@, and the campaign copy addresses the business, not a fake first name. The full reasoning is in our role-address post.
Because {{first_name}} renders whatever the column holds: 'JOHN', 'john smith jr.', 'Dr.', or a LinkedIn emoji. Proper-case the names, split first and last correctly, strip honorifics and credentials, and set a fallback for anything that still looks wrong (empty, single letters, company names in the name field). One glance at 'Hi JOHN,' tells a prospect exactly how personal your email is, and the spintax tester will not catch it because the template is fine, the data was not.
Volume decides. Under 10K rows: Sheets formulas or our CSV Cleaner cover everything above. 10K-100K with messy variance: OpenRefine is built for exactly this, clustering similar values (three spellings of the same company) that formulas cannot see. Beyond that or recurring weekly: a Python script (pandas) encoding the same steps, run as part of your import pipeline so cleaning happens by default rather than by memory. The steps are identical everywhere; only the engine changes.
Prewarmed Inboxes So You Can Send Cold Emails Today
Get Prewarmed & Fresh InboxesGoogle, Microsoft 365 and Azure inboxes with free prewarmed domains and DNS configured before you log in. Prewarmed inboxes send the day they land; every order is delivered within 48 to 72 hours.
Get Prewarmed & Fresh Inboxes