Denormalize your data, storing a redundant copy.
For a df with columns df.a, .b, .c,
synthesize object (string) column df.abc,
perhaps as the JSON serialization of the three numeric columns.
Then use df.abc.str.contains(pattern) in the usual way.
Remember to update a given df.abc entry each time
you mutate any of the three values in its row.
Using a regex on numeric data is weird.
Perhaps your (unstated)
true goal
is to compute set membership, e.g. "show me each row
where at least one of the three values exactly equals 50".
Then the appropriate course of action would be to tidy up and normalize,
so we have columns df.row_num, df.col_index, and df.value.
So representing a zero-th row (a, b, c) of (6, 7, 8) would look like
[(0, 0, 6),
(0, 1, 7),
(0, 2, 8),
]
Armed with that representation,
it becomes trivial to query df[df.value == 50].
And since the row number comes back,
you then can easily ask for all three values
having that row number.