正则匹配零宽断言的问题

我现在有段文本:

https://www.example.com
[https://www.example.com](https://www.example.com)

我想用正则只匹配第一行,不匹配第一行,但是用了零宽断言没有成功,有朋友知道怎么解决吗?
我的正则:

(?!\[)[a-zA-z]+://[^\s]*(?<!\])

我的结果:

共找到 2 处匹配:
http://www.example.com
http://www.example.com](http://www.example.com)
阅读 3.3k
4 个回答

因为字符串都极为相似, 不能简单就能通过零宽来解决, 因为零宽是不消耗字符的, 所以基本上不管前面有没有东西, 它都能找到满足它条件的, 只不过输出的不是我们期待那样而已, 可以尝试用\n协助吧:

import re

a = '''https://www.example.com
[https://www.example.com](https://www.example.com)'''

print re.findall('(?<!\[)(h[tps]+://[\w.]+)\n', a)
^(?!\[)[a-zA-z]+://[^\s]*(?<!\])$

在你的正则的基础上加上^和$

你的表达式本身就写错了,A-z是几个意思?

可以使用锚点 ^ 限制一下开头

^(?!\[)[a-zA-Z]+://[^\s]*(?!\])

就OK了

>>> import re
>>> 
>>> a = '''https://www.example.com
... [https://www.example.com](https://www.example.com)'''
>>> print re.findall(r'^(?!\[)[a-zA-Z]+://[^\s]*(?!\])', a)
['https://www.example.com']
>>> 
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题