【问题标题】:Extracting the inside of an expression using REGEX使用 REGEX 提取表达式的内部
【发布时间】:2019-10-08 19:50:06
【问题描述】:

我目前有一个用于匹配 SQL 查询结果的正则表达式:[^\\n]+(?=\\r\\n\\r\\n\(1 rows affected\))。但是,它没有按预期工作....

'\r\n----------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------\r\nCS: GPS
on Date.

                                                      \r\n\r\n(1 rows affected)\r\n'

我从上面的表达式中得到的是Date,而我想匹配CS: GPS on Date. 如果有前导和后跟空格就可以了……没有什么 Python 的修剪无法处理的。如何更改我的正则表达式以正确完成匹配?

提前致谢。

编辑:我使用的 Python 版本是 Python 3.6

【问题讨论】:

  • 我在您的标签中添加了 python,但最好指定您正在使用的版本。
  • \n\r 实际上是文本还是它们在您收到的输出中实际上是换行符(您的输出实际上是输出换行符还是文字子字符串 \n)?此外,您的积极前瞻是静态的,还是结果中有时会有更多 \r\n
  • @ctwheels 单个逗号内的任何内容都是纯文本
  • ((?:(?!\\n|(?<=\\)n)[\s\S])+?)\s*\\r\\n\\r\\n\(1 rows affected\) 适合您吗?使用中见here

标签: python regex regex-lookarounds


【解决方案1】:

您获得了当前匹配,因为字符类 [^\\n]+ 匹配除 \n 之外的任何字符的 1 次以上。

然后肯定的前瞻断言右边是\r\n\r\n(1 rows affected),这导致匹配 Date.

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

您可以在捕获组中使用非贪婪的.+? 并匹配后面的内容,而不是使用积极的前瞻。

在代码中使用re.DOTALL 让点匹配换行符。

-\\r\\n(.+?) ?\\r\\n\\r\\n\(\d+ rows affected\)

Regex demo

【讨论】:

    【解决方案2】:

    也许,一些类似的表达:

    -{5,}\s*([A-Za-z][^.]+\.)
    

    会提取那个或有点类似的。

    Demo

    测试

    import re
    
    regex = r'-{5,}\s*([A-Za-z][^.]+\.)'
    string = '''
    
    ----------------------------------------------------------
    --------------------------------------------------------------------------------
    --------------------------------------------------------------------------------
    --------------------------------------
    CS: GPS
    on Date.
    
                                                          \r\n\r\n(1 rows affected)\r\n
    '''
    
    print(re.findall(regex, string, re.DOTALL))
    

    输出

    ['CS: GPS\non Date.']
    

    如果您希望简化/修改/探索表达式,在regex101.com 的右上角面板中已对此进行了说明。如果您愿意,您还可以在this link 中观看它如何与一些示例输入匹配。


    【讨论】:

    • 输入字符串与我的输出字符串不匹配,我想你错过了破折线后面的 \r\n ,但这看起来很有趣。我会仔细看看你的表情,看看能不能找到符合我需要的东西。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2022-01-18
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    • 2018-11-04
    • 1970-01-01
    • 2013-07-18
    • 1970-01-01
    相关资源
    最近更新 更多