考虑这个正则表达式:
<a href(="(?:/user)?/([^"]+))">
我想要的是,如果在第二个捕获组中如果有所有/只有数字,那么这个正则表达式不应该匹配。一个例子:
<a href="/user/15594243">
#this should not match
有什么解决办法吗?我只想要一个正则表达式解决方案,我知道我可以通过使用更多的 python 代码来实现这一点。
我认为只需要对所有数字和报价进行负前瞻断言”
user_re = re.compile('<a href(="/(?!(?:user/)?[0-9]+").+)"')
In [74]: [(url,user_re.match(url) and user_re.match(url).group(1)) for url in
['<a href="/user/15594243">',
'<a href="/user/15594243_">',
'<a href="/user/user15594243">',
'<a href="/user/1">',
'<a href="/user/15594243/add">',
'<a href="/item/15594243">',
'<a href="/a"',
'<a href="/15594243">']]
Out[74]:
[('<a href="/user/15594243">', None),
('<a href="/user/15594243_">', '="/user/15594243_'),
('<a href="/user/user15594243">', '="/user/user15594243'),
('<a href="/user/1">', None),
('<a href="/user/15594243/add">', '="/user/15594243/add'),
('<a href="/item/15594243">', '="/item/15594243'),
('<a href="/a"', '="/a'),
('<a href="/15594243">', None)]
编辑:我知道我的最后一次编辑执行了两次正则表达式,但这只是为了显示目的。
关于什么
<a href(="(?:/user)?/([^"/]*?[^0-9"/][^"/]*?))">
? 我们需要包含 /,因为如果不是,它会省略 /user,因为它是可选的,并将 user/ 作为非数字的东西......
您可以使用断言。Lookbehind 断言不起作用,因为它需要固定宽度,所以让我们使用前瞻。
reg = re.compile("<a href=\"(?:/user)?/(?![0-9]+)([^\"/]+)\">")
这将起作用。但是这个正则表达式使那些 url 无效:/user/test/u345
, /user/t/user
(不允许斜杠)。那是因为你的/user
部分是可选的:没有假设 ( [^"/]
) ,[^"]
消耗一切 ( /user/45
)
这样就可以了,替换([^"]+)
为:
([^"]*?[^0-9"][^"]*?)
编辑:除非 python 是带有大写 QI 的 Quaint,否则真的不知道你们都看错了什么。从 javascript 控制台这有效:
>>> 'user/user1234"'.match(/\/([^"]*?[^0-9"][^"]*?)"/);
Array ["/user1234"", "user1234"]
>>> 'user/1234"'.match(/\/([^"]*?[^0-9"][^"]*?)"/);
null
那么,你是在告诉我这不是 Python 的情况吗?为什么?
编辑2:啊哈,可选的/user
犯规结果......这将阻止它:
<a href(="(?:/user)?/(?!user/)([^"]*?[^0-9"][^"]*?))">