如何对缩进标题应用分层编号?

问题描述 投票:0回答:2

我有一个缩进形式的目录来跟踪层次结构,例如:

- title1
-- title1-1
-- title1-2
--- title1-2-1
--- title1-2-2
- title2
-- title2-1
-- title2-2
- title3
- title4

我想用编号格式翻译它们,例如:

1 title1
1.1 title1-1
1.2 title1-2
1.2.1 title1-2-1
1.2.2 title1-2-2
2 title2
2.1 title2-1
2.2 title2-2
3 title3
4 title4

这只是一个示例,其中字符串“title-*”可以是任何标题文本。此外,缩进的大小可能会比本例中的更大。

这来自我的实际工作,我在 Word 文档中收集标题或手动手写的标题,并从头到尾重新格式化这些可能的标题,旨在纠正任何错误的顺序和缩进。

我自己尝试过,虽然大多数标题都被转换为所需的格式,但对于某些标题来说并没有成功。这应该怎么做?

python tableofcontents
2个回答
4
投票

您可以使用 re.sub

replacer 回调来实现逻辑。在该回调中,使用堆栈(在多个替换中维护)来跟踪上“级别”的章节号。

代码:

import re

def add_numbers(s):
    stack = [0]
    
    def replacer(s):
        indent = len(s.group(0)) - 1
        del stack[indent+1:]
        if indent >= len(stack):
            stack.append(0)
        stack[indent] += 1
        return ".".join(map(str,stack))
        

    return re.sub(r"^-+", replacer, s, flags=re.M)

以下是您在示例中的调用方式:

message_string = """- title1
-- title1-1
-- title1-2
--- title1-2-1
--- title1-2-2
- title2
-- title2-1
-- title2-2
- title3
- title4"""

res = add_numbers(message_string)
print(res)

打印:

1 title1
1.1 title1-1
1.2 title1-2
1.2.1 title1-2-1
1.2.2 title1-2-2
2 title2
2.1 title2-1
2.2 title2-2
3 title3
4 title4

0
投票

作为第一种情况,如果我们没有给出初始值,我们可以使用标题中的值。

string="""- title1
-- title1-1
-- title1-2
--- title1-2-1
--- title1-2-2
- title2
-- title2-1
-- title2-2
- title3
- title4"""

string=string.split("\n")


newStr=""
for i in string:
    orj_number=i.split("title")[1]
    number=i.split("title")[1].replace("-",".")
    newStr+=(f"{number} title{orj_number}\n")
print(newStr)

同方法2 我们像一个清单一样思考 如果标题值后没有给出索引,我们可以仅使用初始值执行类似的操作。

string="""- title1
-- title1-1
-- title1-2
--- title1-2-1
--- title1-2-2
- title2
-- title2-1
-- title2-2
- title3
- title4"""

string=string.split("\n")

def counter(stringValue):
    count = 0
    
    for i in stringValue:
        if i == '-':
            count = count + 1
    return count

a=1
b=1
c=1
#
newStr=""
count=0
prevCount=0
for i in string:
    split_text=i.split(" ")
    value=split_text[0]
    text=split_text[1]    
    count=counter(value)    
    if(count==1):
        if(prevCount>=count):
            a+=1
            b=1
            c=1
        newStr+=f"{a} {text}"
    elif(count==2):
        if(prevCount>=count):
            b+=1
        newStr+=f"{a}.{b} {text}"
    elif(count==3):
        if(prevCount>=count):
            c+=1
        newStr+=f"{a}.{b}.{c} {text}"
    newStr+="\n"
    prevCount=count

print(newStr)
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.