【问题标题】:re.M doesnt work for my code [duplicate]re.M 不适用于我的代码 [重复]
【发布时间】:2017-10-29 20:03:46
【问题描述】:

我有这个代码:

import re

s = """line1
   line2"""

print(re.sub("^", "=", s, re.M))

输出是:

=line1
   line2

即注册表达式 "^" 仅查找字符串的开头,而不是文档中所述的行开头。我确实意识到错误在我的代码中,但在哪里?

通常我需要替换字符串中每一行的所有前导空格。

谢谢!

【问题讨论】:

  • python 是 "Python 3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 08:06:12) [MSC v.1900 64 bit (AMD64)] on win32"

标签: python regex


【解决方案1】:

那是因为您将 flags 参数作为位置参数传递。试试:

print(re.sub("^", "=", s, flags=re.M))

按照您所做的将re.M 传递给count 参数。标志在count 之后。在这种情况下最好使用关键字。

通过该修复,我得到:

=line1
=   line2

【讨论】:

    【解决方案2】:

    在您的示例中,您将re.M 作为第四个参数传递给re.sub,这是允许的替换总数。碰巧re.M 是一个数字常量 8,所以你的代码相当于:

    re.sub("^", "=", s, count=8)
    

    正确的版本是将re.M作为关键字参数传递:

    import re
    
    s = """line1
       line2"""
    
    print(re.sub("^", "=", s, flags=re.M))
    

    【讨论】:

      【解决方案3】:

      您可以将标志移至re.compile 以确保它不会被re.sub 误解:

      print(re.sub(re.compile("^", re.M), "=", s))
      

      举个例子:

      import re
      
      s = """line1
         line2"""
      line_start = re.compile("^", re.M)
      print(re.sub(line_start, "=", s))
      # =line1
      # =   line2
      

      【讨论】:

        猜你喜欢
        • 2017-05-23
        • 2018-12-19
        • 1970-01-01
        • 1970-01-01
        • 2018-08-24
        • 2015-12-10
        • 2014-12-21
        • 2018-08-27
        • 2016-01-01
        相关资源
        最近更新 更多