【问题标题】:Selecting in Regex Python在正则表达式 Python 中选择
【发布时间】:2018-07-30 12:00:45
【问题描述】:

我正在编写一个正则表达式来查找这样的代码:

if condition:True:
    statements

第一个冒号不是==。 到目前为止,我已经想出了这个:r"(if|elif) .* : .* :\n\t"
但是我想找到一种方法来选择第一个:并将其替换为==。问题是,我找不到使用正则表达式替换: 的方法,而不会无意中:用== 替换整个if condition 等,方法是写一个

re.sub(r"(if|elif) .* : .* :\n\t","==",text)

或 b:将脚本中的每个冒号替换为 ==,这将导致类似的错误

NameError: Expected a ':', received '=='

那么,有没有办法只用== 替换一部分正则表达式,还是有另一种我忽略的方法?
应该发生什么
输入:

if 3+4:7:
     print("Three plus four is actually seven")
elif 3+6:10:
    print("3+4 is not 7, yet 3+6=10")


控制台:
Three plus four is actually seven

顺便说一下,这是 Python 3。

【问题讨论】:

    标签: python regex syntax


    【解决方案1】:

    尝试将从ifelif 到最后一个: 的所有内容匹配到一个匹配组中,然后将最后一个: 之后的所有内容匹配到另一个组中。现在你可以替换第一个匹配,然后是==,然后是下一个匹配

    re.sub('((?:if|elif)[^:]*):([^:]*:)', r'\1 == \2', s)
    

    【讨论】:

    • 我能想到的唯一改进是使用[^:]* 而不是.*,因此它不会匹配更多的冒号,以防某些行碰巧有3(对于其他一些奇怪的原因)。一般来说,如果可能的话,应该尽量避免使用.*
    • @melwil。我想过这样做,但是如果表达式包含冒号,它会错误地停在冒号上
    • 如果表达式包含比示例更多的冒号,则无法保证此正则表达式无论如何都会正确替换它。我的观点是,这个正则表达式实际上可以忽略你实际上必须匹配的小模式。但是,使用否定表达式会带来另一个有趣的事情,即它匹配换行符,因此您需要打开多行并将行尾与$ 匹配。你原来的正则表达式可能会做得很好。
    • re.sub('((?:if|elif)[^:]*):([^:]*:)', '\\1 == \\2', text) 最后一个: 必须在组内
    • 不需要锚和标志,除非您使用否定冒号[^:] 组而不是点。 . 不匹配没有 dotall (s) 标志的换行符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 2015-01-11
    • 2016-01-11
    • 2016-09-29
    • 2015-11-25
    • 2022-08-18
    • 1970-01-01
    相关资源
    最近更新 更多