为了账号安全,请及时绑定邮箱和手机立即绑定

Python:如何使用正则表达式获取所有可能的匹配项

Python:如何使用正则表达式获取所有可能的匹配项

幕布斯7119047 2021-08-05 15:05:04
我试图在括号之间找到文本,但我想要这样的东西 s="( abc (def) kkk ( mno) sdd ( xyz ) )" p=re.findall(r"\(.*?\)",s)    for i in p:        print(i)输出:( abc (def) ,( mno),( xyz )预期的:( abc (def) ,( abc (def) kkk ( mno) ,( abc (def) kkk ( mno) sdd ( xyz ) ,( abc (def) kkk ( mno) sdd ( xyz ) ) ,(def) ,(def) kkk ( mno)  ,(def) kkk ( mno) sdd ( xyz ) ,(def) kkk ( mno) sdd ( xyz ) ) ,( mno) ,( mno) sdd ( xyz ) ,( mno) sdd ( xyz ) ) ,( xyz ) ,( xyz ) ) 
查看完整描述

1 回答

?
动漫人物

TA贡献1815条经验 获得超10个赞

python regex 模块不处理重叠匹配。通过查找文本中(和的位置,)为开始/结束值创建合理的元组并对字符串进行切片,更容易获得:


使用enumerate(iterable)、collections.defaultdict()和itertools.product():


s="( abc (def) kkk ( mno) sdd ( xyz ) )"


# get positions of all opening and closing ()

from collections import defaultdict

d = defaultdict(list)

print(d)


for idx,c in enumerate(s):

    if c in "()":

        d[c].append(idx)


# combine all positions 

from itertools import product

pos = list(product (d["("],d[")"]))

print(pos)


# slice the text if start < stop+1 else skip

for start,stop in pos:

    if start < stop+1:

        print(s[start:stop+1])

输出:


# d

defaultdict(<class 'list'>, {'(': [0, 6, 16, 27], ')': [10, 21, 33, 35]})


# pos

[(0, 10), (0, 21), (0, 33), (0, 35), (6, 10), (6, 21), (6, 33), (6, 35), 

 (16, 10), (16, 21), (16, 33), (16, 35), (27, 10), (27, 21), (27, 33), (27, 35)]


# texts from pos

( abc (def)

( abc (def) kkk ( mno)

( abc (def) kkk ( mno) sdd ( xyz )

( abc (def) kkk ( mno) sdd ( xyz ) )

(def)

(def) kkk ( mno)

(def) kkk ( mno) sdd ( xyz )

(def) kkk ( mno) sdd ( xyz ) )

( mno)

( mno) sdd ( xyz )

( mno) sdd ( xyz ) )

( xyz )

( xyz ) )


查看完整回答
反对 回复 2021-08-05
  • 1 回答
  • 0 关注
  • 304 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号