
On Sat, Jan 07, 2023 at 10:48:48AM -0800, Peter Ludemann wrote:
You can get almost the same result using pattern matching. For example, your "foo:bar;baz".partition(":", ";") can be done by a well-known matching idiom: re.match(r'([^:]*):([^;]*);(.*)', 'foo:bar;baz').groups()
"Well-known" he says :-) I think that is a perfect example of the ability to use regexes for obfuscation. It gets worse if you want to partition on a regex metacharacter like '.' I think that the regex solution is also wrong because it requires you to know *exactly* what order the separators are found in the source string. If we swap the semi-colon and the colon in the source, but not the pattern, the idiom fails: >>> re.match(r'([^:]*):([^;]*);(.*)', 'foo;bar:baz').groups() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'NoneType' object has no attribute 'groups' So that makes it useless for the case where you want to split of any of a number of separators, but don't know which order they occur in. You call it "almost the same result" but it is nothing like the result from partition. The separators are lost, and it splits the string all at once instead of one split per call. I think this would be a closer match: ```
re.split(r'[:;]', 'foo:bar;baz', maxsplit=1) ['foo', 'bar;baz']
but even there we lose the information of which separator was
partitioned on.
--
Steve