regex 在项目符号末尾追加文本

wf82jlnq  于 2022-12-27  发布在  其他
关注(0)|答案(3)|浏览(116)

我有一个如下形式的多行字符串:

Front

(A) Text1.

(A) Text2.

(A) Text3.

(A) Text4.

(A) Text5.

End

注意,文本1,文本2等可能包含换行符。我希望在每个文本1,文本2等后面附加字符串END
c表示上面的多行字符串,我尝试使用regex re.sub来执行此操作:
c = re.sub("\(A\)(.*?)\n\n\(A\)" , r"(A)\1 END\n\n(A)", c, flags=re.DOTALL)
但是,这只会替换每个奇数编号的点。

Front

(A) Text1. END

(A) Text2.

(A) Text3. END

(A) Text4.

(A) Text5.

End

最后一个要点可以作为例外情况处理,我更关心的是,只有每隔一个要点,END才会附加在末尾,我相信这是因为当第二个(A)被用作re.sub的端点时,Python会将其排除在起点之外。
我该如何解决这个问题?

js81xvg6

js81xvg61#

Python的正则表达式支持 lookahead,这对你的用例很有好处:
第一个月
(?=)表示的lookahead匹配包含的模式,但不将其包括在匹配的范围中(它是零宽度匹配)。
样品:

import re

c = """Front

(A) Text1.
Foo.
Bar.

(A) Text2.
Some extra text and a fake bullet (A)
More text

(A) Text3.

(A) Text4.

(A) Text5.

End"""

c = re.sub("\(A\)(.*?)\n\n(?=\(A\))" , r"(A)\1 END\n\n", c, flags=re.DOTALL)

print(c)

印刷品

Front

(A) Text1.
Foo.
Bar. END

(A) Text2.
Some extra text and a fake bullet (A)
More text END

(A) Text3. END

(A) Text4. END

(A) Text5.

End
bnl4lu3b

bnl4lu3b2#

我用来选择以(A)开头的行的regex

r"\(A\).*"

然后使用一个自定义替换函数在末尾返回原始行+ " END"
下面是代码:

代码:

import re

c = """Front

(A) Text1.

(A) Text2.

(A) Text3.

(A) Text4.

(A) Text5.

End"""

def rep(m):
    return m.group(0) + " END"

c = re.sub(r"\(A\).*", repl=rep, string=c)

print(c)

输出:

Front

(A) Text1. END

(A) Text2. END

(A) Text3. END

(A) Text4. END

(A) Text5. END

End
klr1opcd

klr1opcd3#

你可以修改你的正则表达式模式来使用零宽度的LookAhead和Lookbehind(即不消耗字符)来解决你的问题:
我相信这是因为当第二个(A)被用作re.sub”的端点时

c = re.sub("(?<=\(A\))(.*?)(?=\n\n\(A\)|\n\nEnd)" , r"\1 END", c, flags=re.DOTALL)

print(c)

产出

Front

(A) Text1. END

(A) Text2. END

(A) Text3. END

(A) Text4. END

(A) Text5. END

End

相关问题