【问题标题】:Python 3.5.1 re.sub not working on Multiline [duplicate]Python 3.5.1 re.sub 不适用于多行 [重复]
【发布时间】:2018-03-14 15:48:25
【问题描述】:

谁能解释一下为什么下面的所有 re.sub 命令都找不到并替换匹配项,而具有相同输入的 re.search 至少可以找到匹配项?

import re
a = re.sub(b"^#define", b"***FOUND***", b"#pragma once\r\n\r\n#define WIBBLE\t10\r\n\r\n#include <string.h>\r\n\r\n", re.MULTILINE)

b = re.sub(b"^#define", b"***FOUND***", b"#pragma once\n\n#define WIBBLE\t10\n\n#include <string.h>\n\n", re.MULTILINE)

c = re.sub("^#define", "***FOUND***", "#pragma once\r\n\r\n#define WIBBLE\t10\r\n\r\n#include <string.h>\r\n\r\n", re.MULTILINE)

d = re.sub("^#define", "***FOUND***", "#pragma once\n\n#define WIBBLE\t10\n\n#include <string.h>\n\n", re.MULTILINE)

e = re.search(b"^#define", b"#pragma once\r\n\r\n#define WIBBLE\t10\r\n\r\n#include <string.h>\r\n\r\n", re.MULTILINE)

f = re.search(b"^#define", b"#pragma once\n\n#define WIBBLE\t10\n\n#include <string.h>\n\n", re.MULTILINE)

g = re.search("^#define","#pragma once\r\n\r\n#define WIBBLE\t10\r\n\r\n#include <string.h>\r\n\r\n", re.MULTILINE)

h = re.search("^#define", "#pragma once\n\n#define WIBBLE\t10\n\n#include <string.h>\n\n", re.MULTILINE)

PyCharm 向我报告以下内容作为答案:

a = {bytes} b'#pragma once\r\n\r\n#define WIBBLE\t10\r\n\r\n#include <string.h>\r\n\r\n'
b = {bytes} b'#pragma once\n\n#define WIBBLE\t10\n\n#include <string.h>\n\n'
c = {str} '#pragma once\r\n\r\n#define WIBBLE\t10\r\n\r\n#include <string.h>\r\n\r\n'
d = {str} '#pragma once\n\n#define WIBBLE\t10\n\n#include <string.h>\n\n'
e = {SRE_Match} <_sre.SRE_Match object; span=(16, 23), match=b'#define'>
f = {SRE_Match} <_sre.SRE_Match object; span=(14, 21), match=b'#define'>
g = {SRE_Match} <_sre.SRE_Match object; span=(16, 23), match='#define'>
h = {SRE_Match} <_sre.SRE_Match object; span=(14, 21), match='#define'>

a - d 是错误的,因为没有按预期替换任何内容。

e - f 都是正确的,因为找到了相同的匹配项。

我完全不知道问题出在哪里。我知道另一种可行的方法,但上述方法应该可以满足我的要求。

【问题讨论】:

    标签: python regex


    【解决方案1】:

    我发现了问题。在将 re.MULTILINE 指定为 flags 参数时,我实际上是错误地将 re.MULTILINE 的值指定为 count 参数!

     a = re.sub(b"^#define", b"***FOUND***", b"#pragma once\r\n\r\n#define WIBBLE\t10\r\n\r\n#include <string.h>\r\n\r\n", flags=re.MULTILINE)
    
     b = re.sub(b"^#define", b"***FOUND***", b"#pragma once\n\n#define WIBBLE\t10\n\n#include <string.h>\n\n", flags=re.MULTILINE)
    
     c = re.sub("^#define", "***FOUND***", "#pragma once\r\n\r\n#define WIBBLE\t10\r\n\r\n#include <string.h>\r\n\r\n", flags=re.MULTILINE)
    
     d = re.sub("^#define", "***FOUND***", "#pragma once\n\n#define WIBBLE\t10\n\n#include <string.h>\n\n", flags=re.MULTILINE)
    

    PyCharm 返回这是预期的结果:

     a = {bytes} b'#pragma once\r\n\r\n***FOUND*** WIBBLE\t10\r\n\r\n#include <string.h>\r\n\r\n'
     b = {bytes} b'#pragma once\n\n***FOUND*** WIBBLE\t10\n\n#include <string.h>\n\n'
     c = {str} '#pragma once\r\n\r\n***FOUND*** WIBBLE\t10\r\n\r\n#include <string.h>\r\n\r\n'
     d = {str} '#pragma once\n\n***FOUND*** WIBBLE\t10\n\n#include <string.h>\n\n'
    

    【讨论】:

      猜你喜欢
      • 2017-07-24
      • 1970-01-01
      • 2016-05-29
      • 2017-01-27
      • 2018-02-09
      • 1970-01-01
      • 2021-09-25
      • 2015-11-08
      • 1970-01-01
      相关资源
      最近更新 更多