【问题标题】:Python - string/regex match [closed]Python - 字符串/正则表达式匹配
【发布时间】:2020-11-29 17:21:51
【问题描述】:

我正在尝试匹配以下内容以匹配传入的动态 API 路径。这是一个精确的字符串比较,但是与通配符 * 相关的传入字符串位置应该被忽略并匹配,因为它可以是任何东西。

/v1/*/test 应该匹配 /v1/jnjnjnjn/test 但不应该匹配/v0/knknkk/test/test

/v1/\*/test/\* 应该匹配 /v1/niniiuhi/test/njnjnj 但不应该匹配/v1/niniiuhi/test/njnjnj/knknkmkm

我尝试了以下。

re.search('v1/.*/test', 'v1/vhvhv98988/test/test') 

但它同时匹配v1/njnjnj/testv1/njnjnj/test/test

任何帮助将不胜感激?提前致谢

【问题讨论】:

  • 不清楚什么时候应该匹配的标准是什么。请edit 说明为什么反例不应该匹配。很简单,如果有一个字符串应该被排除,请在应用正则表达式之前检查它,或者在正则表达式中添加一个否定的前瞻。

标签: python regex string match


【解决方案1】:

如果* 应该只匹配一个组件,我们需要从匹配中排除/,或者特别包括那些允许的字符。

  • re.search(r'^/v1/[^/]*/test$', '/v1/jnjnjnjn/test') 将匹配通配符组件中除 / 之外的任何内容。
  • re.search(r'^/v1/[a-z0-9_-]*/test$', '/v1/jnjnjnjn/test') 将匹配通配符组件中的小写字母、数字、下划线和破折号。

通常第二种选择更安全,但它确实取决于您的要求。

在这两种情况下,除非您确实想要搜索子字符串,否则您应该在开头使用 ^ 并在结尾使用 $ 来锚定您的搜索。

作为一种通用工具,像https://regex101.com/ 这样的网站(有很多)可以通过解释正在发生的事情并立即显示结果来帮助开发正则表达式。

【讨论】:

    猜你喜欢
    • 2011-11-28
    • 2012-06-05
    • 2013-12-25
    • 1970-01-01
    相关资源
    最近更新 更多