diff --git a/hgext/convert/cvs.py b/hgext/convert/cvs.py --- a/hgext/convert/cvs.py +++ b/hgext/convert/cvs.py @@ -144,9 +144,7 @@ if root.startswith(b":pserver:"): root = root[9:] - m = re.match( - r'(?:(.*?)(?::(.*?))?@)?([^:\/]*)(?::(\d*))?(.*)', root - ) + m = re.match(r'(?:(.*?)(?::(.*?))?@)?([^:/]*)(?::(\d*))?(.*)', root) if m: conntype = b"pserver" user, passw, serv, port, root = m.groups() diff --git a/mercurial/hgweb/wsgiheaders.py b/mercurial/hgweb/wsgiheaders.py --- a/mercurial/hgweb/wsgiheaders.py +++ b/mercurial/hgweb/wsgiheaders.py @@ -13,7 +13,7 @@ import re -tspecials = re.compile(br'[ \(\)<>@,;:\\"/\[\]\?=]') +tspecials = re.compile(br'[ ()<>@,;:\\"/\[\]?=]') def _formatparam(param, value=None, quote=1): diff --git a/mercurial/ui.py b/mercurial/ui.py --- a/mercurial/ui.py +++ b/mercurial/ui.py @@ -1626,7 +1626,7 @@ # prompt to start parsing. Sadly, we also can't rely on # choices containing spaces, ASCII, or basically anything # except an ampersand followed by a character. - m = re.match(br'(?s)(.+?)\$\$([^\$]*&[^ \$].*)', prompt) + m = re.match(br'(?s)(.+?)\$\$([^$]*&[^ $].*)', prompt) msg = m.group(1) choices = [p.strip(b' ') for p in m.group(2).split(b'$$')] diff --git a/mercurial/util.py b/mercurial/util.py --- a/mercurial/util.py +++ b/mercurial/util.py @@ -1165,7 +1165,7 @@ """ if not v: v = version() - m = remod.match(br'(\d+(?:\.\d+){,2})[\+-]?(.*)', v) + m = remod.match(br'(\d+(?:\.\d+){,2})[+-]?(.*)', v) if not m: vparts, extra = b'', v elif m.group(2): diff --git a/tests/run-tests.py b/tests/run-tests.py --- a/tests/run-tests.py +++ b/tests/run-tests.py @@ -3179,9 +3179,7 @@ expanded_args.append(arg) args = expanded_args - testcasepattern = re.compile( - br'([\w-]+\.t|py)(?:#([a-zA-Z0-9_\-\.#]+))' - ) + testcasepattern = re.compile(br'([\w-]+\.t|py)(?:#([a-zA-Z0-9_\-.#]+))') tests = [] for t in args: case = []