【问题标题】:Python Regular expression to match printing pages and their rangePython正则表达式匹配打印页面及其范围
【发布时间】:2021-12-03 11:43:02
【问题描述】:

我有这个匹配任何打印页面规范的正则表达式(例如:6、1-6、6:4、10-20/3

^([1-9]\d*)((?<=\d)[-]|[:]?)((?<=-|:)?[1-9]\d*)?(?:(?<=)([/]?))([1-9]\d*)?$

我有它,所以它目前匹配:例如:2048-4096/100 , 15:10/3

但是,我的正则表达式也匹配 5/3,而 / 只能跟在冒号或破折号以及一些数字之后,例如 2048-4096/100

在上面的表达式中我尝试过的空肯定的lookbehind: (?:(?&lt;=[:|-]\d)([/]?)) 但这会导致我所有的测试都失败,导致没有匹配。我也尝试过(?:(?&lt;=[:|-]\d*)([/]?)),但后视中不允许使用量词。

我可以在空的正向后面放什么来使它检查 :- 和数字是否在 /强>?

【问题讨论】:

  • (?&lt;=[-:])? 的目的是什么?如果你需要一些可选的东西,只需删除这个lookbehind。
  • 但是在lookbehind中不允许使用量词。内置模块re的限制是lookbehind必须是固定宽度,如果你需要可变长度lookbehind并且允许使用外部模块,看看regex
  • 我也刚刚意识到这个问题。我把它放在那里只匹配一个数字(6、3、1000),但它产生了另一个问题:5:不应该匹配。

标签: python regex regex-lookarounds


【解决方案1】:

你可以使用

^([1-9]\d*)(?:([-:])([1-9]\d*)(?:(/)([1-9]\d*))?)?$

请参阅regex demo详情

  • ^ - 字符串开头
  • ([1-9]\d*) - 第 1 组:一个非零数字,然后是零个或多个数字
  • (?:([-:])([1-9]\d*)(?:(/)([1-9]\d*))?)? - 可选出现
    • ([-:]) - 第 2 组:-:
    • ([1-9]\d*) - 第 3 组:一个非零数字,然后是零个或多个数字
    • (?:(/)([1-9]\d*))? - 可选出现
      • (/) - 第 4 组:/
      • ([1-9]\d*) - 第 5 组:一个非零数字,然后是零个或多个数字
  • $ - 字符串结束。

我保持所有组不变,但至少(/) 组是多余的,因为模式固定为/

【讨论】:

  • 啊,我知道我哪里出错了。似乎我坚持使用环视功能使任务过于复杂。我从 (/) 中删除了括号,因为我需要在 4 个组内完成表达式,并且您的解决方案仍然匹配。感谢您的帮助!
  • @newbiecoder11 对,仅当左侧的正则表达式部分是可选的并且您只想匹配左侧部分匹配的后续模式时,才需要在与此类似的情况下进行环视。这仅用于实时输入验证。
  • 注明。对于您的表达式 5: 和 5- 在不应该匹配时仍然匹配,我立即想到在匹配 : 或 - 之前对数字使用积极的前瞻性,但现在我假设我不应该?
  • @newbiecoder11 5:5- are NOT matched 与我发布的正则表达式。请复制/粘贴帖子中的内容。
  • 嗯,你是对的。我一定是在不知不觉中编辑了一些东西。我很抱歉。
猜你喜欢
  • 2013-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-10
相关资源
最近更新 更多