This time 3 challenges into one to hone your regex skills. If you don’t have regex and or not at home with regex, keep posting your formula / language solutions. Generate 3 different regex formulas to – 1. Convert YYYYMMDD to MMDDYY 2. Extract first and last name and generate last name, first name 3. Make first and last letter of each words capital
📌 Challenge Details and Links
ExcelBI Excel Challenge Number: 552
Challenge Difficulty: ⭐️
📥Download Sample File
📥Link to the solutions on LinkedIn
Solving the challenge of Three Regex Pattern Tasks with Power Query
Power Query solution 1 for Three Regex Pattern Tasks, proposed by Ramiro Ayala Chávez:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
L = List.Transform,
S = Text.Split,
C = Text.Combine,
a = Source[String],
b = S(Text.From(Date.From(a{0})), "/"),
c = L(
b,
each
if Text.Length(_) = 1 then
Text.Insert(_, 0, "0")
else if Text.Length(_) = 4 then
Text.RemoveRange(_, 0, 2)
else
_
),
d = c{1} & "-" & c{2} & "-" & c{0},
e = S(a{1}, " "),
f = C({List.Last(e)} & {List.First(e)}, ", "),
g = L(S(a{2}, " "), Text.ToList),
h = L(
g,
each {Text.Upper(_{0})} & List.RemoveFirstN(List.RemoveLastN(_)) & {Text.Upper(List.Last(_))}
),
i = C(L(h, each C(_)), " "),
Sol = Table.FromColumns({{d} & {f} & {i}}, {"Answer Expected"})
in
Sol
Power Query solution 2 for Three Regex Pattern Tasks, proposed by Ahmed Ariem:
let
People = Text.Split(
Text.FromBinary(
Web.Contents(
"https://gist.githubusercontent.com/azmaahmed/eb51ac2c96fbdbd7ca0e796063517499/raw/10fc8d1c87801846e27a37f7428576ebf501f97f/GetPeoplesName"
)
),
","
),
f = (x) =>
[
l = Text.Length(Text.Select(x, "-")) = 2,
a = Splitter.SplitTextByAnyDelimiter({" ", "-"})(x),
b =
if l then
a{1} & "-" & a{2} & "-" & Text.End(a{0}, 2)
else if List.ContainsAny(People, a) then
a{2} & ", " & a{0}
else
Text.Combine(
List.Transform(
a,
(x) =>
Text.Start(Text.Proper(x), Text.Length(x) - 1)
& Text.Proper(Text.End(Text.Proper(x), 1))
),
" "
)
][b],
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
to = Table.TransformColumns(Source, {"String", f})
in
to
Power Query solution 3 for Three Regex Pattern Tasks, proposed by Ahmed Ariem:
let
f = (x) =>
[
l = Text.Length(Text.Select(x, "-")) = 2,
a = Splitter.SplitTextByAnyDelimiter({" ", "-"})(x),
b =
if l then
a{1} & "-" & a{2} & "-" & Text.End(a{0}, 2)
else if List.ContainsAny(People, a) then
a{2} & ", " & a{0}
else
Text.Combine(
List.Transform(
a,
(x) =>
Text.Start(Text.Proper(x), Text.Length(x) - 1)
& Text.Proper(Text.End(Text.Proper(x), 1))
),
" "
)
][b],
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
to = Table.TransformColumns(Source, {"String", f})
in
to
----
attached file
https://1drv.ms/x/s!AiUZ0Ws7G26RkQuLBDSz59yhCfly?e=ufShNG
Solving the challenge of Three Regex Pattern Tasks with Excel
Excel solution 1 for Three Regex Pattern Tasks, proposed by Bo Rydobon 🇹🇭:
=REGEXREPLACE(A2:A4,{"..(..)-(.*)";"(w+).*?(w+$)";"(w+)(w)"},{"$2-$1";"$2, $1";"u$1U$2"})
Excel solution 2 for Three Regex Pattern Tasks, proposed by Rick Rothstein:
=VSTACK(TEXT(A2,"mm-dd-yy"),TEXTJOIN(", ",,CHOOSECOLS(TEXTSPLIT(A3," "),3,1)),TEXTJOIN(" ",,MAP(TEXTSPLIT(PROPER(A4)," "),LAMBDA(x,REPLACE(x,LEN(x),1,UPPER(RIGHT(x)))))))
Or as individual formulas...
In C2:
=TEXT(A2,"mm-dd-yy")
In C3:
=TEXTJOIN(", ",,CHOOSECOLS(TEXTSPLIT(A3," "),3,1))
In C4:
=TEXTJOIN(" ",,MAP(TEXTSPLIT(PROPER(A4)," "),LAMBDA(x,REPLACE(x,LEN(x),1,UPPER(RIGHT(x))))))
Excel solution 3 for Three Regex Pattern Tasks, proposed by Rick Rothstein:
=TEXT(A2,"mm-dd-yy")
to this...
=0+A2
but now you will have to format cell A2 to change the date serial number (which will be returned from the formula)
Excel solution 4 for Three Regex Pattern Tasks, proposed by John V.:
=REGEXREPLACE(A2:A4,{"..(..)-(.+)";"(w+) w+ (w+)";"(w)(w*)(w)"},{"$2-$1";"$2, $1";"u$1$2u$3"})
Excel solution 5 for Three Regex Pattern Tasks, proposed by 🇰🇷 Taeyong Shin:
=REGEXREPLACE(
A2,
"d{2}(d{2})-([d-]+)",
"$2-$1"
)
=REGEXREPLACE(
A3,
"(^w+).*?(w+$)",
"$2, $1"
)
=REGEXREPLACE(
A4,
"b(w)(w+)?(w)b",
"U$1L$2U$3"
)
Excel solution 6 for Three Regex Pattern Tasks, proposed by Kris Jaganah:
=REGEXREPLACE(
A2,
"d{2}(d{2})-(d{2})-(d{2})",
"$2-$3-$1"
)
Excel solution 7 for Three Regex Pattern Tasks, proposed by Julian Poeltl:
=TEXT(
A2*1,
"MM-DD-YY"
)
=LET(
S,
TEXTSPLIT(
A3,
,
" "
),
TAKE(
S,
-1
)&", "&TAKE(
S,
1
)
)
=LET(
S,
PROPER(
TEXTSPLIT(
A4,
" "
)
),
TEXTJOIN(
" ",
,
LEFT(
S,
LEN(
S
)-1
)&UPPER(
RIGHT(
S
)
)
)
)
Excel solution 8 for Three Regex Pattern Tasks, proposed by Timothée BLIOT:
=REGEXREPLACE(
A2,
"(d{2})(d{2})-(d{2})-(d{2})",
"$3-$4-$2"
)
(ii) =REGEXREPLACE(
A3,
"(^[A-Za-z]+)(.*s)([A-Za-z]+$)",
"$3, $1"
)
(iii) =REGEXREPLACE(
A4,
"([a-z]?b|b[a-z]?)",
"U$1"
)
Excel solution 9 for Three Regex Pattern Tasks, proposed by Sunny Baggu:
=VSTACK(
TEXT(
A2,
"mm-dd-yy"
),
TEXTAFTER(
A3,
" ",
-1
) & ", " & TEXTBEFORE(
A3,
" "
),
LET(
a,
TEXTSPLIT(
A4,
,
" "
),
b,
LEN(
a
),
TEXTJOIN(
" ",
,
PROPER(
LEFT(
a,
b - 1
)
) & UPPER(
RIGHT(
a
)
)
)
)
)
Excel solution 10 for Three Regex Pattern Tasks, proposed by Abdallah Ally:
=REGEXREPLACE(A2:A3,{".+(d{2})-(d+)-(d+)";"([a-z]+)s.+s([a-z]+)"},{"$2-$3-$1";"$2, $1"},,1)
For third value
=TEXTJOIN(" ",,MAP(TEXTSPLIT(A4," "),LAMBDA(x,PROPER(LEFT(x,LEN(x)-1))&UPPER(RIGHT(x)))))
Excel solution 11 for Three Regex Pattern Tasks, proposed by Abdallah Ally:
=VSTACK(
REGEXREPLACE(
A2:A3,
{".+(d{2})-(d+)-(d+)";"([a-z]+)s.+s([a-z]+)"},
{"$2-$3-$1";"$2, $1"},
,
1
),
TEXTJOIN(
" ",
,
MAP(
TEXTSPLIT(
A4,
" "
),
LAMBDA(
x,
PROPER(
LEFT(
x,
LEN(
x
)-1
)
)&UPPER(
RIGHT(
x
)
)
)
)
)
)
Excel solution 12 for Three Regex Pattern Tasks, proposed by Anshu Bantra:
=VSTACK(
REGEXREPLACE(A2, "d{2}(d+)-(d+)-(d+)", "$2-$3-$1"),
REGEXREPLACE(A3, "(w+) (w+) (w+)", "$3, $1"),
REGEXREPLACE(A4, "(w)(w*)(w)", "u$1$2u$3")
)
Excel solution 13 for Three Regex Pattern Tasks, proposed by Md. Zohurul Islam:
=LET(
A,REGEXREPLACE(A2, "(d{4})-(d{2})-(d{2})", "$2-$3-" & MID(A2,3,2)),
B,REGEXREPLACE(A3, "(w+)s+(w+)s+(w+)", "$3, $1"),
C,REGEXREPLACE(A4, "(?i)(w)(w*)(w)", "U$1E$2U$3E"),
result,VSTACK(A,B,C),
result)
Excel solution 14 for Three Regex Pattern Tasks, proposed by Hamidi Hamid:
=LET(x,TEXT(TEXTJOIN("/",,,CHOOSECOLS(TEXTSPLIT(A2,"-",,1),{231})),"jj-mm-aa"),y,LOOKUP("zzz",TEXTSPLIT(A3," ",,-1))&", "&TEXTBEFORE(A3," "),z,TEXTJOIN(" ",,MAP(TEXTSPLIT(A4," ",1),LAMBDA(a,UPPER(LEFT(a,1))&MID(LEFT(a,LEN(a)-1),2,LEN(a))&UPPER(RIGHT(a,1))))),VSTACK(x,y,z))
Excel solution 15 for Three Regex Pattern Tasks, proposed by JvdV –:
=REGEXREPLACE(
A2:A4,
"(([A-Z]w*).* (w+)|d.(..)-(.+)|(w+?)(w)?b)",
"$3$5${2:+, }${4:+-}$2$4u$6u$7"
)
Excel solution 16 for Three Regex Pattern Tasks, proposed by Eddy Wijaya:
=VSTACK(
TEXT(A2,"mm-dd-yy"),
ARRAYTOTEXT(CHOOSECOLS(TEXTSPLIT(A3," "),-1,1)),
TEXTJOIN(" ",,BYROW(TEXTSPLIT(A4,," "),LAMBDA(r,DROP(REDUCE(0,r,LAMBDA(a,v,VSTACK(a,LET(
spl,MID(v,SEQUENCE(,LEN(v)),1),
TEXTJOIN("",,CHOOSECOLS(HSTACK(UPPER(TAKE(spl,,1)),DROP(spl,,1),UPPER(TAKE(spl,,-1))),SEQUENCE(COUNTA(spl)-1),-1)))))),1)))))
Excel solution 17 for Three Regex Pattern Tasks, proposed by RIJESH T.:
=TEXT(A2,"mm-dd-yy")
=TEXTAFTER(A3," ",2)&", "&TEXTBEFORE(A3," ")
=TEXTJOIN(" ",,SUBSTITUTE(TEXTSPLIT(PROPER(A4)," "),RIGHT(TEXTSPLIT(PROPER(A4)," "),1),UPPER(RIGHT(TEXTSPLIT(PROPER(A4)," "),1)),{1,1,2}))
Excel solution 18 for Three Regex Pattern Tasks, proposed by Songglod P.:
=TEXT(A2,"MM-DD-YY")
D3
=TEXTJOIN(", ",,TEXTAFTER(A3," ",-1),TEXTBEFORE(A3," "))
D4
=TEXTJOIN(" ",,MAP(TEXTSPLIT(A4," "),LAMBDA(w,REPLACE(PROPER(w),LEN(w),1,UPPER(RIGHT(w))))))
Excel solution 19 for Three Regex Pattern Tasks, proposed by Stefan Alexandrov:
=VSTACK(
TEXT(
A2,
"mm-dd-yy"
),
TEXTJOIN(
", ",
1,
CHOOSECOLS(
TEXTSPLIT(
A3,
" "
),
3
),
CHOOSECOLS(
TEXTSPLIT(
A3,
" "
),
1
)
),
TEXTJOIN(
" ",
1,
LEFT(
TEXTSPLIT(
PROPER(
A4
),
" "
),
LEN(
TEXTSPLIT(
PROPER(
A4
),
" "
)
)-1
)&UPPER(
RIGHT(
TEXTSPLIT(
PROPER(
A4
),
" "
),
1
)
)
)
)
Excel solution 20 for Three Regex Pattern Tasks, proposed by Nonbow Wu:
=VSTACK(
REGEXREPLACE(
A2,
".*(d{2})-(d+-d+)",
"$2-$1"
),
REGEXREPLACE(
A3,
"^(w+)b.+b(w+)$",
"$2, $1"
),
REGEXREPLACE(
A4,
"b(w)|(w)b",
"U$0"
)
)
Excel solution 21 for Three Regex Pattern Tasks, proposed by Md. Shah Alam, Microsoft Certified Trainer:
=TEXT(
A2,
"mm-dd-yy"
)
2. =LET(
x,
TEXTSPLIT(
A3,
" "
),
y,
INDEX(
x,
COUNTA(
x
)
),
z,
INDEX(
x,
1
),
y&","&z
)
3. =LET(
x,
TEXTSPLIT(
A4,
" "
),
y,
UPPER(
LEFT(
x
)
)&MID(
x,
2,
LEN(
x
)-2
)&UPPER(
RIGHT(
x
)
),
TEXTJOIN(
" ",
,
y
)
)
Solving the challenge of Three Regex Pattern Tasks with Python
Python solution 1 for Three Regex Pattern Tasks, proposed by Konrad Gryczan, PhD:
import pandas as pd
import re
path = "552 Regex Challenges.xlsx"
input = pd.read_excel(path, usecols="A:B", nrows=4)
test = pd.read_excel(path, usecols="C", nrows=4)
q1 = input.iloc[0:1].assign(Answer=lambda df: df['String'].str.replace(r"(d{2})(d{2})-(d{2})-(d{2})", r"3-4-2", regex=True))
q2 = input.iloc[1:2].assign(Answer=lambda df: df['String'].str.replace(r"^(w+) w+ (w+)$", r"2, 1", regex=True))
q3 = input.iloc[2:3].assign(Answer=lambda df: df['String'].str.replace(r"b(w)(w*?)(w)b", lambda m: m.group(1).upper() + m.group(2) + m.group(3).upper(), regex=True))
answers = pd.concat([q1, q2, q3])['Answer'].reset_index(drop=True)
print(answers.equals(test["Answer Expected"])) # True
Solving the challenge of Three Regex Pattern Tasks with Python in Excel
Python in Excel solution 1 for Three Regex Pattern Tasks, proposed by Alejandro Campos:
import re
df = pd.DataFrame({
"Original_String": ["2024-&11-03", "Donald John Trump", "excel is awesome"]
})
def convert_date(date_str):
return re.sub(r'd{2}(d+)-(d+)-(d+)', r'2-3-1', date_str)
def name_swap(name_str):
return re.sub(r'(w+)s+w+s+(w+)', r'2, 1', name_str)
def capitalize_first_last(word_str):
return re.sub(r'b(w)(w*)(w)b', lambda m: m.group(1).upper() + m.group(2).lower() + m.group(3).upper(), word_str)
df['Answer_Expected'] = df['Original_String']
df.loc[0, 'Answer_Expected'] = convert_date(df.loc[0, 'Original_String']) # Para la fecha
df.loc[1, 'Answer_Expected'] = name_swap(df.loc[1, 'Original_String']) # Para el nombre
df.loc[2, 'Answer_Expected'] = capitalize_first_last(df.loc[2, 'Original_String']) # Para las palabras
df[['Answer_Expected']]
Python in Excel solution 2 for Three Regex Pattern Tasks, proposed by Anshu Bantra:
import re
txt = xl("A1:A4", headers=True)['String'].values
def capitalize_first_last(match):
if len(word) > 1:
return word[0].upper() + word[1:-1] + word[-1].upper()
else:
return word.upper()
patterns = [
(r'd{2}(d{2})-(d{2})-(d{2})', r'2-3-1'),
(r'(w+) (w+) (w+)', r'3, 1'),
(r'(w)(w*)(w)', capitalize_first_last)
]
[re.sub(patterns[_][0], patterns[_][1], txt[_]) for _ in range(len(txt))]
Python in Excel solution 3 for Three Regex Pattern Tasks, proposed by Ümit Barış Köse, MSc:
import re
def convert_yyyymmdd(date_string):
match = re.match(r'(d{4})-(d{2})-(d{2})', date_string)
return f"{match.group(2)}-{match.group(3)}-{match.group(1)[2:]}" if match else None
def extract_names(name_string):
names = name_string.split()
return f"{names[-1]}, " if len(names) >= 2 else None
def capitalize_ends(text):
df = xl("A2:A4")
functions = [convert_yyyymmdd, extract_names, capitalize_ends]
results = [func(df.iloc[i, 0]) for i, func in enumerate(functions)]
results
Solving the challenge of Three Regex Pattern Tasks with R
R solution 1 for Three Regex Pattern Tasks, proposed by Konrad Gryczan, PhD:
library(tidyverse)
library(readxl)
path = "Excel/552 Regex Challenges.xlsx"
input = read_excel(path, range = "A1:B4")
test = read_excel(path, range = "C1:C4")
q1 = input %>%
filter(row_number() == 1) %>%
mutate(Answer = str_replace(String,
"(\d{2})(\d{2})-(\d{2})-(\d{2})",
"\3-\4-\2"))
q2 = input %>%
filter(row_number() == 2) %>%
mutate(Answer = str_replace(String,
"^(\w+) \w+ (\w+)$",
"\2, \1"))
q3 = input %>%
filter(row_number() == 3) %>%
mutate(Answer = gsub("\b(\w)(\w*?)(\w)\b",
"\U\1\E\2\U\3",
String, perl = TRUE))
answers = bind_rows(q1, q2, q3) %>%
select(Answer)
all.equal(answers, test, check.attributes = FALSE)
#> [1] TRUE
&&
