【问题标题】:regexp: match character group or end of line正则表达式:匹配字符组或行尾
【发布时间】:2012-02-27 15:51:57
【问题描述】:

如何匹配[](字符组)中的^(行首)和$(行尾)?


简单例子

干草堆字符串:zazty

规则:

  1. 匹配任何“z”或“y”
  2. 如果前面有
    1. 一个“a”,“b”;或
    2. 在行首。

通过: 匹配前两个“z”

一个可以工作的正则表达式是:
(?:^|[aAbB])([zZyY])

但我一直认为在字符组内使用类似的内容会更清晰
[^aAbB]([zZyY])
(在该示例中,假设 ^ 表示行首,而不是它的真正含义,字符组的负数)


注意:使用 python。但是知道在 bash 和 vim 上也会很好。

更新:再读一遍manual,它说的是字符集,除了字符类(例如\w)之外,一切都失去了它的特殊含义。

在字符类列表中,有\A 表示行首,但这不起作用[\AaAbB]([zZyY])

知道为什么吗?

【问题讨论】:

    标签: python regex


    【解决方案1】:

    将字符“a”连接到字符串的开头。然后使用[aAbB]([zZyY])

    【讨论】:

    • 其实很聪明
    【解决方案2】:

    为什么不尝试转义字符\? ([\^\$])

    更新: 如果您想查找所有以“a”开头的 Z 和 As,则可以使用正向向后查找。可能没有办法在字符组中指定通配符(因为通配符也是字符)。 (我很高兴知道它)。

    private static final Pattern PATTERN = Pattern.compile("(?<=(?:^|[aA]))([zZyY])");
    
    public static void main(String[] args) {
        Matcher matcher = PATTERN.matcher("zazty");
    
        while(matcher.find()) {
            System.out.println("matcher.group(0) = " + matcher.group(0));
            System.out.println("matcher.start() = " + matcher.start());
        }
    }
    

    输出:

    matcher.group(0) = z
    matcher.start() = 0
    matcher.group(0) = z
    matcher.start() = 2
    

    【讨论】:

    • 不,那它只是一个字面意思^——仍然不是“行首”。
    • 特殊字符(例如 ^+!*?...)失去了意义。 ^ 如果是第一个字符,则变为“非”。
    • 后视组不是无关紧要吗?我的意思是,您将一个不匹配的组传递给后视组
    • 你仍然有一个非捕获组和 or 条件这种方式
    • @gcb,是的。但您可能想保留它,因为它明确表明没有匹配项。
    【解决方案3】:

    试试这个:

    (?<![^abAB])([yzYZ])
    

    【讨论】:

    • 我想知道在这项任务中,正面或负面的看法是否更有效。
    【解决方案4】:

    您不能在[] 中匹配^$,因为在字符类中唯一具有特殊含义的字符是^(如“everything but”)和-(如在“范围”中)(和字符类)。 \A\Z 只是不算作字符类。

    这适用于所有(标准)风格的正则表达式,所以你会被 (^|[stuff])($|[stuff]) 困住(其实还不错)。

    【讨论】:

    • 好吧,这很糟糕,因为在 python 中,我现在被findall() 卡住了。因为search() 也会返回与(?:...) 匹配的字符。不是世界末日,我知道...
    • 你不能在你想要的位周围使用捕获括号并使用match.group(1)吗?您已经在那里有了捕获括号。 m.start(1)m.end(1)
    • 消极的后视你实际上可以做到这一点,看看我下面的答案
    • @gcb,试试看后面。 search 的行为可能不同。
    • m=re.search('(?:a)(z)','zazty'); print m.group(1)。这将只提取'z'。或者,正如其他评论者所建议的那样,环视是 0 宽度。
    猜你喜欢
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    相关资源
    最近更新 更多