我有多个文本块被这些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>
答案 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解析器。