问题描述
考虑文本结构
(Title)[#1Title-link]
(Chapter1)[#Chapter1-link]
(Chapter2)[#Chapter2-link]
(Chapter3)[#Chapter3-link]
我如何反向引用[#Title-link]而又不与查找结果匹配。我正在尝试改变
(Chapter1)[#Chapter1-link] => (Chapter1)[#1Title-link-Chapter1-link]
(Chapter2)[#Chapter2-link] => (Chapter2)[#1Title-link-Chapter2-link]
(Chapter3)[#Chapter3-link] => (Chapter3)[#1Title-link-Chapter3-link]
我尝试使用并找到
(\(Title\)\[(.*?)])([\s\S]*?\[)#(\D.*?\])
然后将其替换为
$1$3$2-$4
但是这里的问题是每次发现仅突出显示一次,我在很多章中都发现效率太低,无法一一替换。 保持常量标题也不是一件好事,因为我有多个具有相同结构的文件。
在正则表达式中可能吗?欢迎任何解决方案或替代方案。
解决方法
您可以首先进行搜索以获取正确的替换字符串,然后使用该替换字符串进行后续替换操作。您没有指定使用的语言,所以这是Python中的代码(对组1的反向引用是\1
,而不是更常见的$1
):
import re
text = """(Title)[#1Title-link]
(Chapter1)[#Chapter1-link]
(Chapter2)[#Chapter2-link]
(Chapter3)[#Chapter3-link]"""
m = re.search(r'(?:\(Title\)\[#([^\]]*)\])',text)
assert(m) # that we have a match
substitution = m.group(1)
text = re.sub(r'\[#Chapter([^\]]*)\]',r'[#' + substitution + r'-Chapter\1' + ']',text)
print(text)
打印:
(Title)[#1Title-link]
(Chapter1)[#1Title-link-Chapter1-link]
(Chapter2)[#1Title-link-Chapter2-link]
(Chapter3)[#1Title-link-Chapter3-link]