1

考虑这个正则表达式:

<a href(="(?:/user)?/([^"]+))">

我想要的是,如果在第二个捕获组中如果有所有/只有数字,那么这个正则表达式不应该匹配。一个例子:

<a href="/user/15594243">
#this should not match

有什么解决办法吗?我只想要一个正则表达式解决方案,我知道我可以通过使用更多的 python 代码来实现这一点。

4

5 回答 5

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)]

编辑:我知道我的最后一次编辑执行了两次正则表达式,但这只是为了显示目的。

于 2012-07-15T16:43:19.110 回答
0

关于什么

<a href(="(?:/user)?/([^"/]*?[^0-9"/][^"/]*?))">

? 我们需要包含 /,因为如果不是,它会省略 /user,因为它是可选的,并将 user/ 作为非数字的东西......

于 2012-07-15T15:14:39.427 回答
0

将此用于第二个捕获组。

\d*[a-zA-Z]+[a-zA-Z0-9]*

这使您可以根据需要以数字开头,至少需要一个字母表,然后根据需要使用字母数字。

于 2012-07-15T15:14:56.603 回答
0

您可以使用断言。Lookbehind 断言不起作用,因为它需要固定宽度,所以让我们使用前瞻。

reg = re.compile("<a href=\"(?:/user)?/(?![0-9]+)([^\"/]+)\">")

这将起作用。但是这个正则表达式使那些 url 无效:/user/test/u345, /user/t/user(不允许斜杠)。那是因为你的/user部分是可选的:没有假设 ( [^"/]) ,[^"]消耗一切 ( /user/45)

于 2012-07-15T15:16:20.370 回答
-2

这样就可以了,替换([^"]+)为:

([^"]*?[^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"][^"]*?))">
于 2012-07-15T15:07:46.613 回答