【问题标题】:Regex - Stop after finding the first pattern正则表达式 - 找到第一个模式后停止
【发布时间】:2021-07-11 04:06:02
【问题描述】:

对于这样的字符串:

1. Jane, Doe2. Good, Jay3. Turn, Bob[key]

如果不存在[key],则需要提取Jane, Doe,然后在1.2. 之间进行提取 (或)

Turn, Bob 如果存在[key]

换一种说法:

  1. 如果存在[key],则需要提取[key]之前的人并停止进程。
  2. 如果[key] 不存在,则接1. 之后的任何人

我试过这个,但它把 Jane、Doe 和 Turn、Bob 都拉起来了

(\.([^\.])(.+)\[key\])|(1\.(.+)2\.)

如何在找到第一个成功的模式后停止,知道模式是从左到右读取的? [key] 可以是任何人 - 1,2 or 3

谢谢。

【问题讨论】:

    标签: python-3.x regex


    【解决方案1】:

    对于这些要求,您可以在 Python 中使用此正则表达式并进行替换:

    (?<=\d\.\s)[a-zA-Z, ]+(?=\[key])|(?<=1\.\s)(?!.*\[key])[a-zA-Z, ]+
    

    RegEx Demo

    正则表达式详细信息:

    • (?&lt;=\d\.\s):肯定的后视断言在当前位置之前有一个数字后跟一个空格
    • [a-zA-Z, ]+:匹配 1+ 个字母、空格或逗号字符
    • (?=\[key]):正向前瞻断言在当前位置之后有文本[key]
    • |:或者
    • (?&lt;=1\.\s):肯定的后视断言在当前位置之前有一个数字 1 后跟点,后跟一个空格
    • (?!.*\[key]):否定后向断言在当前位置之后没有 [key] 文本
    • [a-zA-Z, ]+:匹配 1+ 个字母、空格或逗号字符

    【讨论】:

    • 一个小技巧:如果名称中包含句点(如 Sr、Doe、John),如何转义?
    • @anubhava,是的,我已经测试过了,这对我来说很好,干杯。
    • @anubhava 抱歉应该更指出——为此:1. Jane,Doe2。很好,杰3。 Sr. Doe, John[键]
    • @skrubber:好的。然后您使用:(?&lt;=\d\.\s)[a-zA-Z., ]+(?=\[key])|(?&lt;=1\.\s)(?!.*\[key])[a-zA-Z., ]+see demo
    • [a-zA-Z., ]+ 表示匹配1个或多个字母或逗号或点或空格
    【解决方案2】:

    不确定为什么将 .+ 放入正则表达式,但它很贪心并且匹配 . Good, Jay3. Turn, Bob。所以左边的交替匹配。

    建议您删除交替两边的 .+ ( | )。

    【讨论】:

    • 不确定我得到你了。那么我将如何捕获句点(。)和 [key] 之间的字符串? (.+) 对 (.*) 不是非贪婪的吗?
    猜你喜欢
    • 1970-01-01
    • 2014-10-29
    • 2015-03-24
    • 2013-05-18
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多