首页 > 解决方案 > 字符类在正则表达式中算作组吗?

问题描述

我分配的一个小项目应该从给定的文本中提取网站 URL。以下是它最相关的部分:

webURLregex = re.compile(r'''(
   (https://|http://)
   [a-zA-Z0-9.%+-\\/_]+
   )''',re.VERBOSE)

这确实可以正常工作,但我注意到它还包括“,”和“。” 在它打印的 URL 字符串中。所以我的第一个问题是,如何让它排除它检测到的字符串末尾的任何标点符号?

我的第二个问题是指标题本身(finally),但似乎并没有真正影响我正在研究的这个特定程序:Do character classes(在这种情况下是 [a-zA-Z0-9.%+-\ /_]+ )算作组(在这种情况下是 group[3] )?

提前致谢。

标签: pythonregex

解决方案


反过来回答:不,字符类只是括号文本的简写。它们提供组的方式与用括号括起来的方式不同。它们允许正则表达式引擎选择指定的字符——不多也不少。

关于查找逗号和点:实际上,我在这里看到了问题,尽管下面可能仍然有价值,所以我会留下它。本质上,你有这个:字符具有特殊含义:这两个字符之间的所有内容——通过 ascii 代码[a-zA-Z0-9.%+-\\/_]+。有效范围也是-如此。[A-a]它包括 AZ,但也包括一堆不是 AZ 的其他字符。如果你想包括 - 在范围内,那么它需要是最后一个字符:[a-zA-Z0-9.%+\\/_-]+应该工作


对于逗号,我实际上没有在您的正则表达式中看到它,所以我不能对此发表评论。它不应该被允许在 url 中的任何地方。但总的来说,您只想添加更多组/更多条件。

首先,将 url 分解为您想要的特定组:(scheme)://(domain)(endpoint)

每个部分都有一组不同的要求:例如,域可能需要以斜杠结尾: [a-zA-Z0-9]+\.com/应该匹配任何使用字母数字字符的域,并且以 .com 结尾(请注意\.,否则它将捕获任何单个字符后跟com/

对于端点部分,您可能仍希望允许使用特殊字符,但如果您确定不希望 url 以点结尾,那么您可以做一些事情[A-Za-z0-9]——注意缺少点在这里,另外,它是长度——只有一个字符。这将改变你的正则表达式的其余部分,所以你需要考虑一下。

一些随机的想法:

  1. 如果您确定要匹配整行,$请在正则表达式的末尾添加 a 以表示该行的结尾。这里的一种可能性是您的正则表达式确实匹配文本的某些部分,但忽略了最后的垃圾,因为您没有说要阅读整行。
  2. 正则表达式变得非常复杂——它们是一种只写代码。添加一些评论以提供帮助。例如
web_url_regex = re.compile(
  r'(http://|https://)'  # Capture the scheme name
  r'([a-zA-Z0-9.%+-\\/_])' # Everything else, apparently
)
  1. 不要试图在您的验证中详尽无遗——如前所述,url 很难验证,因为您无法确定一个是否有效。但形式非常一致,如上所述:方案、域、端点(和查询字符串)

推荐阅读