此正则表达式错误地验证URL和此URL。为什么?

时间:2014-04-28 08:37:56

标签: python regex validation

  &copy 2014 <a href="http://www.fairfaxmedia.co.nz">Fairfax New Zealand Limited</a><br/>
  <a href="/about-stuff/legal/25044/privacy-policy">Privacy</a><!--  |

以上是我的HTML文档中的违规部分。

以下是我的正则表达式。它适用于我的文档中的每个其他URL。除了这一个。

urliter = re.finditer(r'(http://|https://)([\w]+\.[\w\.]+\/?)([\w\/\.]+")',lines)

urlMatches = defaultdict(list)
for match in urliter:
    urlMatches[match.group(2)].append(match.group())

当我查看输出时,出于某种原因,www.fairfaxmedia.co.nz会在结尾处切断z,因此它只显示www.fairfaxmedia.co.n的{​​{1}}

我无法弄清楚为什么会这样?

另外,问题#2 - 我如何仅在报价中搜索网址,但是将报价保留在匹配项之外?

2 个答案:

答案 0 :(得分:1)

你的正则表达式使用捕获组:

  • (http://|https://)匹配(并在第1组中捕获)http部分
  • ([\w]+\.[\w\.]+\/?)在第二组中捕获
  • ([\w\/\.]+")在第三组中捕获

由于您在+中放置了([\w\/\.]+"),因此字符类[\w\/\.]无法匹配任何字符。这意味着在http://www.fairfaxmedia.co.nz"中,最后一个组必须至少匹配z"

因此,z不能出现在第二组(您正在呼叫的那个)中,插图为here

如果您只想将域名与网址的其余部分分开,可以将您的正则表达式调整为:

"(https?://(\w+\.[\w.]+)(/?[\w/.-]*))"

整个网址(不含引号)位于捕获组1,捕获组2中的域名,捕获组3中的其余区域:请参阅demo here

答案 1 :(得分:0)

要在引号中搜索文字,但在引号中留下引文,您可以使用外观断言。

例如(从罗宾斯回答的核心正则表达式)

(?<=\")(https?://(\w+\.[\w.]+)(/?[\w\/\.]*))(?=\")