gpt4 book ai didi

Python 正则表达式在括号外多次出现

转载 作者:太空宇宙 更新时间:2023-11-04 10:54:28 24 4
gpt4 key购买 nike

我想搜索并替换 <> 之外的所有匹配项。我可以假设所有括号都匹配。例如,我想用“*”替换“BLOCK”:

BLOCKaaa<BLOCKaaaa>aaaaa<>BLOCKzzzBLOCKBLOCK

会变成:

*aa<BLOCKaaaa>aaaaa<>*zzz**

我尝试了以下方法:

-在行首添加>,在行尾添加<,称其为LINEwith><

-运行:

re.sub('(>[^<>]*)(BLOCK)+? ([^<>]*<?)', '\\1*\\3', LINEwith><)

但它给了我这个:

'>*aaa<BLOCKaaaa>aaaaa<>BLOCKzzzBLOCK*<'

我不确定如何替换 ><

之间的所有匹配项

有人可以帮我解决这个问题吗?或者建议更好的方法。

最佳答案

因为您可以假设括号总是匹配的,所以以下应该有效。

re.sub(r'BLOCK(?=[^>]*(<|$))', '*', line)

这还假定不能有嵌套的括号。

这使用前瞻来确保没有 >下一个 < 之前的字符字符或字符串的结尾。由于使用了前瞻,因此正则表达式实际匹配的唯一文本是 BLOCK , 所以替换简化为 '*'因为不再有任何捕获组。

这里是一个版本,最多可以使用一层嵌套括号:

BLOCK(?=([^<>]*(<(<[^>]*>|[^<>])*>)?)*$)

例子:

>>> p = re.compile(r'BLOCK(?=([^<>]*(<(<[^>]*>|[^<>])*>)?)*$)')
>>> p.sub('*', 'BLOCK<BLOCK<BLOCK>>BLOCK<BLOCK>BLOCKzzzBLOCKBLOCK')
'*<BLOCK<BLOCK>>*<BLOCK>*zzz**'

如您所见,正则表达式并不真正适合嵌套数据结构。

关于Python 正则表达式在括号外多次出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11057785/

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