请教一个巢式括号字符串正则表达式的写法

前提:已知ii,u和x都是未知内容。

请教如何从字符串 <uuuu<uuiixx>xxxxxx>如何摘除中间(也就是距离ii最近,套嵌最深的)<uuiixx>的字符串得到<uuuuxxxxxx>

谢谢各位大佬啦,因为python的re正则都是贪婪模式,非贪婪的?只能找到后面最近的,不太会整 :thinking:

(<[^<]+)<[^>]+>(.*)

谢谢大佬,不过这个好像不太ok?, 这里面似乎没有体现出ii的寻找匹配呀?

你跟我之前一樣,對問號的理解有誤,我也是用了多年才明白。

問號有兩種用法:

  1. 壹個或零個,比如「lalao?」,那就匹配lala跟lalao

  2. 非貪婪,這個要緊挨星號或加號,比如「<.+?ii.+?>」,這個可能就是你想要的答案

但是,不同的文本處理軟件,用的是不同的正則規範,比如vim的非貪婪就與衆不同,因為你不用vim我就不說了。

谢谢呀,这种我试过,但是你看在python里面
` import re

a = “<uuuxuxxxxx>”

re.sub(r"<.+?ii.+?>", “”, a) `

结果是这样的:

'uxxxxx>' 它对左边似乎还是贪婪的。

我上面那个是匹配巢式的,

(.*)<[^<]+ii[^>]+>(.*)

匹配ii用这个,注意这两个都是靠分组来提取的

请教一下,什么是“巢式括号”啊?搜了一下,第一个结果就是这个帖子 :joy:

可能是长得跟巢上面那三个笔画一样哈哈哈哈哈哈~

不需要提取,只要刪掉中間部份:

<[^<]+ii[^>]+>
1 Like

支持零宽断言的话就很好弄了:
<(?=[^<]+ii)([^<>]+)(?<=ii[^>]+)>
替换为空

可以试试:

其中 .*? 表示非贪婪匹配所有的字符。

import re
for astr in (
    '<uuuu<uuiixx>xxxxxx>',
    '<abc>',
    '<uuuu<uuixx>xxxxxx>'
    ):
    asub = re.sub(r'(<.*?)(<.*?ii.*?>)(.*>)', r'\1\3', astr)
    print(astr, asub)

output:

<uuuu<uuiixx>xxxxxx> <uuuuxxxxxx>
<abc> <abc>
<uuuu<uuixx>xxxxxx> <uuuu<uuixx>xxxxxx>

r’<.?ii.?>‘, r’’

刪掉中間的就可以了。

就是括号外面套括号哈 :grinning:

nested 翻译成嵌套比较好 :upside_down_face:
我还以为巢式是 巢字头上的 巛,还想着挺形象,哈哈哈哈

2 Likes

也可以說成「套娃」,比如俄羅斯三套娃。