【问题标题】:How can I use negative lookbehind to exclude fractions?如何使用负后向排除分数?
【发布时间】:2021-08-25 22:53:48
【问题描述】:

我有一个需要解构为数量(数字)和单位(字符串)的测量列表。像

1 gal.
500lbs
none
2.25gal
4feet twine
2lbs regular and 2lbs lite

使用\d+(\.\d+)? 一切都很好,但现在我有一小部分加入:

3/4gal

我需要从这个搜索中排除分数,以便我可以单独处理它。我通过插入负前瞻成功排除了分子 (3) - \d+(?!\/)(\.\d+)?,但我不知道如何排除分母 (4)。我想我应该使用负面的lookbehind,但我不知道如何。 \d+(?!\/)(?<!\/)(\.\d+)?\d+(?!\/)(\.\d+)?(?<!\/) 仍然匹配 4

谢谢!

【问题讨论】:

    标签: regex-lookarounds


    【解决方案1】:

    在像 \d+(?!\/)(?<!\/)(\.\d+)? 这样的构造中,后向 (?<!\/) 始终为真,因为您之前唯一可以匹配(而不是断言)的是数字。

    您还可以排除数字部分左侧的/,并在匹配小数部分后添加前瞻。

    (?<!/)\d+(?:\.\d+)?(?!/)
    

    说明

    • (?&lt;!/)负向lookbehind,直接断言当前位置左边不是/
    • \d+匹配1+位数
    • (?:\.\d+)? 匹配可选的 . 和 1+ 位
    • (?!/)负前瞻,直接断言当前位置右边不是/

    regex demo

    【讨论】:

    • 我仍然无法分解和理解逻辑——我是正则表达式的新手——但它有效:)
    • @JJL 我已经添加了模式中各部分的细分。
    • 非常好!谢谢!
    【解决方案2】:

    您可以匹配并跳过所有出现的[digits]/[digits] 模式:

    \d+\/\d+(*SKIP)(*F)|\d+(?:\.\d+)?
    

    请参阅regex demo

    \d+\/\d+(*SKIP)(*F)|部分匹配一个或多个数字,/,一个或多个数字,然后(*SKIP)(*F)使正则表达式引擎匹配失败并从失败位置开始搜索下一个匹配,所以@ 987654327@-like 子字符串将无法与您的输出混淆。

    【讨论】:

    • 啊,我真的很喜欢这个。但遗憾的是,我正在使用 python re,它不支持 (*SKIP)(*F)。无法安装任何其他库,因此无法使用 pypi regex
    • @JJL 没问题,安装pip install regex,然后使用import regex as re,就可以了。或者你想让/3gal 不匹配?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 2018-08-13
    • 2021-11-09
    相关资源
    最近更新 更多