python - 字符类在正则表达式中算作组吗?
问题描述
我分配的一个小项目应该从给定的文本中提取网站 URL。以下是它最相关的部分:
webURLregex = re.compile(r'''(
(https://|http://)
[a-zA-Z0-9.%+-\\/_]+
)''',re.VERBOSE)
这确实可以正常工作,但我注意到它还包括“,”和“。” 在它打印的 URL 字符串中。所以我的第一个问题是,如何让它排除它检测到的字符串末尾的任何标点符号?
我的第二个问题是指标题本身(finally),但似乎并没有真正影响我正在研究的这个特定程序:Do character classes(在这种情况下是 [a-zA-Z0-9.%+-\ /_]+ )算作组(在这种情况下是 group[3] )?
提前致谢。
解决方案
反过来回答:不,字符类只是括号文本的简写。它们提供组的方式与用括号括起来的方式不同。它们只允许正则表达式引擎选择指定的字符——不多也不少。
关于查找逗号和点:实际上,我在这里看到了问题,尽管下面可能仍然有价值,所以我会留下它。本质上,你有这个:字符具有特殊含义:这两个字符之间的所有内容——通过 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]
——注意缺少点在这里,另外,它是长度——只有一个字符。这将改变你的正则表达式的其余部分,所以你需要考虑一下。
一些随机的想法:
- 如果您确定要匹配整行,
$
请在正则表达式的末尾添加 a 以表示该行的结尾。这里的一种可能性是您的正则表达式确实匹配文本的某些部分,但忽略了最后的垃圾,因为您没有说要阅读整行。 - 正则表达式变得非常复杂——它们是一种只写代码。添加一些评论以提供帮助。例如
web_url_regex = re.compile(
r'(http://|https://)' # Capture the scheme name
r'([a-zA-Z0-9.%+-\\/_])' # Everything else, apparently
)
- 不要试图在您的验证中详尽无遗——如前所述,url 很难验证,因为您无法确定一个是否有效。但形式非常一致,如上所述:方案、域、端点(和查询字符串)
推荐阅读
- swift - 我应该如何从 UserDefaults 更新对象值?
- amazon-web-services - 用于分离后端操作的 AWS SQS 消息?可以通过 SQS 消息触发 api 吗?
- linux - 在 Open Suse Leap 15.1 上对 32 位可执行文件的 iconv_open 支持
- javascript - 如何在不使用 eval 的情况下编写动态 if 条件?
- build - BitBake (Yocto) 构建的编译数据库
- sql - XMLTABLE 提取元素的位置()
- google-cloud-platform - 谷歌云函数内存消耗记录
- substrate - Kusama - 提供的主机标头未列入白名单
- reactjs - TypeError:无法读取未定义的属性“道具”
- rust - 如何使用泛型函数来减少这种重复代码