需要正则表达式帮助:匹配某个字符串如果不以特定子模式开头且某个字符不应出现

1 投票
3 回答
4580 浏览
提问于 2025-04-16 14:57

我需要为一个小项目想出一个正则表达式。

这个字符串不能以以下内容开头:

"/wiki"

而且它也不能有以下的模式:

"/.*:.*" (简单来说,就是这个模式以字符'/'开头,后面有任意出现的':')

另外,它也不能包含某个字符'#'

所以,基本上这些字符串都会被拒绝:

"/wiki/index.php?title=ROM/TAP&action=edit&section=2"
"/User:romamns"
"/Special:Watchlist"
"/Space_Wiki:Privacy_policy"
"#column-one"

而这些字符串则会被接受:

"/ROM/TAP/mouse"
"http://www.boost.org/"

我会在Python中使用这个正则表达式(如果这有什么不同的话)。

谢谢大家的帮助。

3 个回答

0

如果你符合下面这个正则表达式的规则,那么它应该会失败。

^(\/wiki|.*?[\:#])
1

这个经过测试的脚本使用了带注释的正则表达式,能够准确地满足你所说的需求:

import re
def check_str(subject):
    """Retturn True if subject matches"""

    reobj = re.compile(
        """               # Match special string
        (?!/wiki)         # Does not start with /wiki.
        (?![^/]*/[^:]*:)  # Does not have : following /
        [^#]*             # Match whole string having no #
        $                 # Anchor to end of string.
        """, 
        re.IGNORECASE | re.MULTILINE | re.VERBOSE)
    if reobj.match(subject):
        return True
    else:
        return False
        return False

data_list = [
    r"/wiki/index.php?title=ROM/TAP&action=edit&section=2",
    r"/User:romamns",
    r"/Special:Watchlist",
    r"/Space_Wiki:Privacy_policy",
    r"#column-one",
    r"/ROM/TAP/mouse",
    r"http://www.boost.org/",
    ]
cnt = 0
for data in data_list:
    cnt += 1
    print("Data[%d] = \"%s\"" %
      (cnt, check_str(data)))
5

这段代码 ^(/(?!wiki)[^:#]*|[^#/][^#]*)$ 应该是可以的,已经在 这里 测试过了。当然,我可能漏掉了什么,但看起来这符合你的要求。

撰写回答