您应该知道,Matz 选择将/s
修饰符 ( SINGLELINE
or DOTALL
) 重命名为 Ruby 的/m
( MULTILINE
) 修饰符(处理换行符是否被视为“任何字符” ),从而迷惑所有人.
。
相反,其他风格的/m
orMULTILINE
修饰符(它决定是否匹配在行的开头/结尾而不是整个字符串的开头/结尾)在 Ruby 中根本不存在^
。$
这些锚点总是 在行的开头/结尾匹配。
所以,要将你的代码从 Ruby 翻译成 Python,你需要做
def reindent(line, numIndent):
return re.sub(r'(.)^', r'\1' + ' ' * numIndent, line, flags=re.DOTALL|re.MULTILINE)
如果您的目标是缩进除第一行之外的所有行(这就是这样做的),您可以简化正则表达式:
def reindent(line, numIndent):
return re.sub(r'(?<!\A)^', ' ' * numIndent, line, flags=re.MULTILINE)
结果:
>>> s = "The following lines\nare indented,\naren't they?"
>>> print(reindent(s,1))
The following lines
are indented,
aren't they?