【问题标题】:limit number of repetitions [duplicate]限制重复次数[重复]
【发布时间】:2014-06-04 17:07:29
【问题描述】:

我需要通过 pat 字符串来确定 src 字符串的大小,例如:

src ='AAAABBBB'
pat ='(A+|B+)B+'

但是,'+' 匹配任何 1 或任何数量的外观,当 src 很大时它可能会非常慢。但是因为我确切地知道 src 是什么,所以我可以设计一个 pat 来准确匹配每个时期出现的“A”或“B”的数量,例如,

pat = '(A|B)\4B\4'

但我的问题还需要出现 4 次或更少的语法,例如

pat= '(A|B)\4(or less)B\4(or less)'

有人知道这个语法吗?

【问题讨论】:

    标签: python regex


    【解决方案1】:

    您可以使用 {m} 语法指定特定的重复次数,其中 m 是预期的重复次数:

    A{4}B{4}
    

    需要正好四个A和四个B字符。

    有类似的语法来指定一个范围而不是一个固定的数字;来自Regular Expression syntax documentation

    {m}
    指定准确匹配前一个 RE 的 m 个副本;较少的匹配会导致整个 RE 不匹配。例如,a{6} 将精确匹配六个 'a' 字符,但不会匹配五个。

    {m,n} 导致生成的 RE 匹配前一个 RE 的 mn 个重复,尝试匹配尽可能多的重复。例如,a{3,5} 将匹配 3 到 5 个 'a' 字符。省略 m 指定下限为零,省略 n 指定无限上限。例如,a{4,}b 将匹配aaaab 或一千个'a' 字符后跟b,但不匹配aaab。逗号不能省略,否则修饰符会与前面描述的形式混淆。

    {m,n}?
    导致生成的 RE 匹配前一个 RE 的 mn 个重复,尝试匹配尽可能少的重复。这是先前限定符的非贪婪版本。例如,在 6 个字符的字符串 'aaaaaa' 上,a{3,5} 将匹配 5 个 'a' 字符,而 a{3,5}? 将仅匹配 3 个字符。

    【讨论】:

    • 好!但是如果我无法确定它是贪婪还是非贪婪呢?
    • @Jun:什么意思?可变大小量词(*+{m,n})都有贪婪和非贪婪的变体;后者通过将? 添加到量词。 {m} 永远不会是贪婪的或非贪婪的,而是匹配确切数量的字符。
    • 好的我明白了,所以贪婪或非贪婪只有在匹配有不同的结果时才会发生,如果根本不匹配,则不需要关注贪婪或非贪婪的事情。谢谢
    • 不要忘记:{m,n} 而不是 {m, n}(模式不应该有空格,否则它将把花括号解释为文字)
    • 这可能有点老了,但如果我想准确选择 2 或 4?喜欢{2|4},但有效。
    猜你喜欢
    • 2019-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    相关资源
    最近更新 更多