gpt4 book ai didi

python - 使用正则表达式查找并替换每个匹配的任意数量的元素

转载 作者:行者123 更新时间:2023-12-02 05:06:22 24 4
gpt4 key购买 nike

我的目标是识别标记语言中的粗体括号文本,例如:

[B] blah blah (foo) blah [/B]

并使用正则表达式用另一个标签包围它,如下所示:

[B] blah blah [C](foo)[/C] blah [/B]

这是我使用 Python 的尝试:

outtext = re.sub(r'(\[B\].*?)(\(.*?\))(.*?\[/B\])', r'\1[C]\2[/C]\3', intext)

问题是,如果 block 中有多个带括号的字符串,它就不起作用:

Input: [B] (foo) (bar) [/B]
Expected: [B] [C](foo)[/C] [C](bar)[/C] [/B]
Actual: [B] [C](foo)[/C] (bar) [/B]

我知道发生这种情况的原因,但不知道如何解决。是否可以更改我的正则表达式,以便能够在每个 block 中查找并替换任意数量的带括号的字符串,而不是只有一个?

最佳答案

这种问题通常可以通过仅替换其他匹配项中的匹配项来解决。您需要运行 re.sub使用将匹配所有 B 的正则表达式标记的子字符串,并使用 re.sub 中的可调用函数仅在这些匹配项内替换括号之间多次出现的字符串。作为替换参数。

解决方案如下:

import re
text = "[B] blah blah (foo) blah [/B]\n[B] (foo) (bar) [/B]"
print(re.sub(r'(?s)\[B].*?\[/B]', lambda x: re.sub(r'\([^()]*\)', r'[C]\g<0>[/C]', x.group()), text))

请参阅Python demo .

注意:如果您有较长的文本,请展开懒点图案并使用

r'\[B][^[]*(?:\[(?!/?B])[^[]*)*\[/B]'

参见this regex demo .

输出:

[B] blah blah [C](foo)[/C] blah [/B]
[B] [C](foo)[/C] [C](bar)[/C] [/B]

(?s)\[B].*?\[/B]模式匹配 [B] ,然后 0+ 个尽可能少的字符,直到最左边 [/B] (注意 (?s) 允许 . 匹配任何字符,包括换行符)。然后,一旦找到匹配项,它就会传递给可调用函数,并且 \([^()]*\)正则表达式在该匹配上运行。 \([^()]*\)匹配最接近的括号之间的任何子字符串,即 ( ,然后是 ( 之外的 0+ 个字符和)然后)\g<0>替换模式中是对整个匹配的替换反向引用。

关于python - 使用正则表达式查找并替换每个匹配的任意数量的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60204135/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com