在特定条件下匹配第二组(使用单个正则表达式)

时间:2012-07-15 15:01:59

标签: python regex

考虑这个正则表达式:

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

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

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

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

5 个答案:

答案 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)

第二个捕获组的

Use this

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

这允许您根据需要从数字开头,至少需要一个字母,并根据需要使用字母数字进行跟进。

答案 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"][^"]*?))">