【问题标题】:(Python/ Regular Expression) How to select text between two given words?(Python /正则表达式)如何在两个给定单词之间选择文本?
【发布时间】:2019-08-16 12:42:26
【问题描述】:

Langaue(Python3.X,Re 库)

我有一个字符串如下

import re
query_string = r'SELECT "a"."name", "a"."create_date", "a"."state", SUM("b"."cost") AS "amount", SUM("b"."cost") FILTER (WHERE "a"."state" = 'UNPAID') AS "paid", SUM("b"."cost") FILTER (WHERE "a"."state" = 'PAID') AS "unpaid" FROM "maintenance"'

我想选择“列名”,即"a"."name", "a"."create_date", "a"."state"。从上面的字符串。

介于"SELECT" and "SUM(.*)" 之间 任何帮助表示赞赏。

我试过下面的正则表达式模式

  1. r'SELECT (.* ), [^(SUM(.* )]'

  2. r'SELECT (.* ), SUM(.* )'

但两者都没有给出准确的结果

预期结果:

 "a"."name", "a"."create_date", "a"."state"(No comma at the endth)

【问题讨论】:

    标签: regex python-3.x


    【解决方案1】:

    你可以使用

    (?:SELECT\s*)(.*?)(?:,\s*SUM.*)
    

    创建单个捕获组。

    两个(?:...) 组成非捕获组。
    (.*?) 是一个非贪婪组,它将在第一个“SUM”之前停止,而不是最后一个。

    【讨论】:

      【解决方案2】:

      用途:

      (SELECT\s*)([^()]+)(,\s*SUM.*)
      

      并将第二组与\2 一起使用。或者将\1\3 组替换为空。

      测试here

      【讨论】:

        【解决方案3】:

        你可以使用:

        sql = '''SELECT "a"."name", "a"."create_date", "a"."state", SUM("b"."cost") AS "amount", SUM("b"."cost") FILTER (WHERE "a"."state" = 'UNPAID') AS "paid", SUM("b"."cost") FILTER (WHERE "a"."state" = 'PAID') AS "unpaid" FROM "maintenance"'''
        
        res = re.search(r'SELECT (.+?), SUM', sql)
        print(res.group(1))
        

        输出:

        "a"."name", "a"."create_date", "a"."state"
        

        【讨论】:

        • 你可以在我的回答下找到(.+?)的解释。它是我使用的(.*?)“零或更多”的“至少一个”版本。这就是为什么认为纯代码的答案不如有一些解释的答案有用。
        • @AjayPhape: .+? 表示 1 个或多个任意字符,而不是贪婪(即它匹配的字符越少)。见:regular-expressions.info/possessive.html
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多