需要正则表达式帮助:匹配某个字符串如果不以特定子模式开头且某个字符不应出现
我需要为一个小项目想出一个正则表达式。
这个字符串不能以以下内容开头:
"/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)[^:#]*|[^#/][^#]*)$
应该是可以的,已经在 这里 测试过了。当然,我可能漏掉了什么,但看起来这符合你的要求。