我有一个缩进形式的目录来跟踪层次结构,例如:
- 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 文档中收集标题或手动手写的标题,并从头到尾重新格式化这些可能的标题,旨在纠正任何错误的顺序和缩进。
我自己尝试过,虽然大多数标题都被转换为所需的格式,但对于某些标题来说并没有成功。这应该怎么做?
的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
作为第一种情况,如果我们没有给出初始值,我们可以使用标题中的值。
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)