python3:re.sub随机工作

时间:2015-11-01 14:37:38

标签: python replace

我有多个文本块被这些html标签包围:

<code type="block" lexer="python"> my text </code>

最小工作示例

我需要用其他文本替换它们(在这里的最小例子中,一个简单的字符串:&#34; REPLACEMENT&#34;)。我提供了两个样本块:一个是正确替换的,另一个不是:我无法理解为什么,它们似乎没有不同。我包括的测试

print(old_blockCode, "\n\n", new_blockCode, "\n_______", "\n\n")

让我觉得这个问题出现在re.sub中,但它打败了我。

#!/usr/bin/python3
import re
fileContent = """<code type="block" lexer="python">import re
for old_code, new_code in zip(codes_list, highlighted_list):
pattern = re.sub(old_code, new_code, filecontent)
pattern.append(pa)</code>
<code type="block" lexer="python">import re
inputFile = "test"
outputFile = "testout"</code>
"""
blockCodes_list = []
blockHighlighted_list = []
blockCodes = re.finditer(r'<code type="block" lexer="python">(.*?)</code>', fileContent, flags=re.DOTALL)
for match in blockCodes:
    block = match.group(1)
    blockCodes_list.append(block)
    blockHighlighted = "REPLACEMENT"
    blockHighlighted_list.append(blockHighlighted)
newfileContent = fileContent
for old_blockCode, new_blockCode in zip(blockCodes_list, blockHighlighted_list):
    newfileContent = re.sub(old_blockCode, new_blockCode, newfileContent)       
    print(old_blockCode, "\n\n", new_blockCode, "\n_______", "\n\n")   
print(newfileContent)

预期产出

<code type="block" lexer="python">REPLACEMENT</code>
<code type="block" lexer="python">REPLACEMENT</code>

实际输出

<code type="block" lexer="python">import re
for old_code, new_code in zip(codes_list, highlighted_list):
pattern = re.sub(old_code, new_code, filecontent)
pattern.append(pa)</code>
<code type="block" lexer="python">REPLACEMENT</code>

1 个答案:

答案 0 :(得分:1)

它完全符合您的要求。您希望文本以<code…>标记开头,后跟一串后跟</code>的任意内容。这就是它的作用:

<code type="block" lexer="python">import re
for old_code, new_code in zip(codes_list, highlighted_list):
pattern = re.sub(old_code, new_code, filecontent)
pattern.append(pa)</code>
<code type="block" lexer="python">REPLACEMENT</code>

这是格言的一个特例&#34;你不能用正则表达式解析XHTML&#34;。正则表达式根本无法与嵌套组匹配。可能会有这样的答案,他们说你可以用非贪婪的资格赛,但这是错误的。

使用XML解析器。