【问题标题】:Multiline pattern with specific ending具有特定结尾的多行模式
【发布时间】:2019-11-08 08:11:35
【问题描述】:

我试图匹配一些多行模式,它具有最后一行的特定序列结尾。

我正在使用 re.DOTALL | re.MULTILINE 匹配多行,但它没有捕捉到我想要的第一行的结尾。

title = re.compile(
    r"TITLE\([^\"\);]*",
    re.DOTALL | re.MULTILINE
)

titles = re.findall(patterns.title, file)

字符串的格式:

标题(“废话 废话 包含_” 包含_) 包含_; 但不是_”); ");

结果是Title(",但我想要所有字符串。

【问题讨论】:

  • re.DOTALL | re.MULTILINE 完全不会影响您的模式。
  • @WiktorStribiżew 我认为它会影响,因为当模式是例如 r"TITLE(.*" 它返回我想要的内容以及 "); 之后的所有内容;
  • Sveta,您的问题中有r"TITLE\([^\"\);]*"。当然re.DOTALL会影响.,但是r"TITLE\([^\"\);]*"中没有.

标签: python regex


【解决方案1】:

解决此问题的一种方法是使用前瞻来测试“结束令牌”,在您的情况下为 ");

re.compile(r"TITLE\(\"((?:(?!\"\);).)*)", re.DOTALL | re.IGNORECASE)

将匹配您示例字符串的这一部分

blah_blah
contain_"
contain_)
contain_;
but_not_

解释:

TITLE # literal: TITLE (re.IGNORECASE 不区分大小写) \(\" # 字面量: (" ( # 第一组 (?: # 非捕获组 (?!# 负前瞻 \"\); # 后面没有:"); ) # 结束前瞻 . # 匹配下一个字符(包括 \n 和 re.DOTALL) )* # 结束非捕获组,重复 ) # 结束组 1(将包含最后一场比赛)

https://regex101.com/r/km3uuV/1

【讨论】:

    猜你喜欢
    • 2022-12-09
    • 2023-01-31
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-21
    相关资源
    最近更新 更多