考虑这个正则表达式:
<a href(="(?:/user)?/([^"]+))">
我想要的是,如果在第二个捕获组中,如果有全部/唯一数字,那么此正则表达式不应该匹配。一个例子:
<a href="/user/15594243">
#this should not match
任何解决方案?我只想要一个正则表达式解决方案,我知道我可以通过使用更多的python代码实现这一点。
答案 0 :(得分:2)
所有数字和引用的否定前瞻断言都是我认为需要的“
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)]
编辑:我知道我的上一次编辑会执行两次正则表达式,但这仅用于显示目的。
答案 1 :(得分:0)
怎么样?
<a href(="(?:/user)?/([^"/]*?[^0-9"/][^"/]*?))">
? 我们需要包含/,因为如果不是它省略/ user,因为它是可选的,并将用户/作为非数字的东西...
答案 2 :(得分:0)
答案 3 :(得分:0)
您可以使用断言。 Lookbehind断言不起作用,因为它需要固定宽度,所以让我们使用前瞻。
reg = re.compile("<a href=\"(?:/user)?/(?![0-9]+)([^\"/]+)\">")
这会奏效。但是这个正则表达式会使这些URL无效:/user/test/u345
,/user/t/user
(不允许使用斜杠)。那是因为您的/user
部分是可选的:没有假设([^"/]
),[^"]
消耗了所有内容(/user/45
)
答案 4 :(得分:-2)
这样做,将([^"]+)
替换为:
([^"]*?[^0-9"][^"]*?)
编辑:除非python是古怪的大写字母Q我不知道你们都错了。从javascript控制台可以工作:
>>> 'user/user1234"'.match(/\/([^"]*?[^0-9"][^"]*?)"/);
Array ["/user1234"", "user1234"]
>>> 'user/1234"'.match(/\/([^"]*?[^0-9"][^"]*?)"/);
null
那么,你是否告诉我在Python中不是这种情况?为什么呢?
edit2 :啊哈,可选的/user
会对结果造成犯规......这会阻止它:
<a href(="(?:/user)?/(?!user/)([^"]*?[^0-9"][^"]*?))">