Python 3.5.1 re.sub无法在Multiline上运行

时间:2017-10-03 12:34:37

标签: python regex

任何人都可以解释为什么以下所有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都是正确的,因为找到了相同的匹配。

我在这里完全不知道问题是什么。我知道另一种方法可以做到这一点,但上面应该做我想做的事。

1 个答案:

答案 0 :(得分:3)

我发现了问题。当指定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'