【问题标题】:Matching newline and any character with Python regex使用 Python 正则表达式匹配换行符和任何字符
【发布时间】:2015-10-05 00:43:17
【问题描述】:

我有这样的文字

var12.1
一个
一个
dsa

88
123!!!
secondVar12.1

varsecondVar 之间的字符串可能不同(并且它们的数量可能不同)。

如何使用正则表达式转储它?
我正在尝试这样的事情无济于事:

re.findall(r"^var[0-9]+\.[0-9]+[\n.]+^secondVar[0-9]+\.[0-9]+", str, re.MULTILINE)

【问题讨论】:

    标签: python regex regular-language


    【解决方案1】:

    你可以用:

    var\d+(?:(?!var\d).)*?secondVar
    

    demore.S (or re.DOTALL) modifier 必须与此正则表达式一起使用,以便. 可以匹配换行符。分隔符之间的文本将在第 1 组中。

    注意:最接近的匹配将匹配 (?:(?!var\d).)*? tempered greedy token (即,如果您有另一个 var + var 后面的数字 + 1+ 位,则匹配将在第二个 varsecondVar 之间。

    注意2:您可能希望使用\b 字边界来匹配以它们开头的字:\bvar(?:(?!var\d).)*?\bsecondVar

    正则表达式解释

    • var - 匹配起始分隔符
    • \d+ - 1 位以上
    • (?:(?!var\d).)*? - 一个缓和的贪婪令牌,匹配任何字符,0 次或更多(但尽可能少)重复,不启动字符序列 var 和数字
    • secondVar - 从字面上匹配 secondVar

    IDEONE DEMO

    import re
    p = re.compile(r'var\d+(?:(?!var\d).)*?secondVar', re.DOTALL)
    test_str = "var12.1\na\na\ndsa\n\n88\n123!!!\nsecondVar12.1\nvar12.1\na\na\ndsa\n\n88\n123!!!\nsecondVar12.1"
    print(p.findall(test_str))
    

    输入字符串的结果(出于演示目的,我将其加倍):

    ['12.1\na\na\ndsa\n\n88\n123!!!\n', '12.1\na\na\ndsa\n\n88\n123!!!\n']
    

    【讨论】:

    • re.DOTALLre.S are synonyms
    • 我觉得我错过了什么。现在,我想我终于明白了。
    【解决方案2】:

    您正在寻找re.DOTALL 标志,其正则表达式如下:var(.*?)secondVar。此正则表达式将捕获 varsecondVar 之间的所有内容。

    【讨论】:

    • .* 是不正确的,因为它是贪婪的,如果有更多的分隔部分,则会过度匹配。
    猜你喜欢
    • 2012-01-08
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 2012-10-15
    相关资源
    最近更新 更多