gpt4 book ai didi

python - 如何从正则表达式匹配中获取索引?

转载 作者:行者123 更新时间:2023-11-28 21:48:28 31 4
gpt4 key购买 nike

我正在为我的问题寻找更 Pythonic 或函数式编程的解决方案。

我将一个正则表达式与一个字符串匹配。正则表达式围绕通配符的每次重复捕获一个组。我使用这些组来掩盖比赛中的通配符。下面的代码显示了一个示例:

out_str_list = []
original_str = 'XYZQUACKESTARNFSDMADESBHSCHILDABCD'
match = re.search('(?=(QUACK(.{2,4})TAR(.{2,4})MAD(.{3,5})CHILD))', original_str) # searching while grouping repetitions of wildcards
hide_ranges = tuple(match.span(i) for i in range(2, len(match.groups()) + 1)) # ((8, 10), (13, 17), (20, 25))
match_range = match.span(1) # (3, 30)
i = 0

out_str_list.append(original_str[match.span(1)[0]:hide_ranges[0][0]])
while i < len(hide_ranges):
out_str_list.append("-({0})-".format(hide_ranges[i][1] - hide_ranges[i][0]))
if i == 0 and len(hide_ranges) != 1:
out_str_list.append(original_str[hide_ranges[0][1]:hide_ranges[1][0]])
elif i == len(hide_ranges) - 1:
pass
else:
out_str_list.append(original_str[hide_ranges[i][1]:hide_ranges[i+1][0]])
i += 1
out_str_list.append(original_str[hide_ranges[i-1][1]:match.span(1)[1]])
match_str = ''.join(out_str_list)

assert match_str = 'QUACK-(2)-TAR-(4)-MAD-(5)-CHILD'

该代码有效,但似乎比需要的要冗长得多。此示例的更一般形式:

我有一个字符串:XYZQUACKESTARNFSDMADESBHSCHILDABCD

从正则表达式匹配中,我生成元组:((8, 10), (13, 17), (20, 25))

和一个包含匹配开始和结束索引的元组:(3, 30)

我怎样才能得到一个看起来像这样的字符串:QUACK-(2)-TAR-(4)-MAD-(5)-CHILD

我想为每个捕获的组做类似str.splitstr.join({length of gap}) 的事情。我不能完全这样做,因为我得到的是索引而不是要拆分的字符串。我知道函数式编程方法会使用 map 或 filter 之类的东西,但我不确定如何以我想要的方式应用字符串切片。

最佳答案

您可以使用re.split 来提取字符串中不匹配的部分,并使用re.findall 来查找字符串中的匹配部分。然后您可以遍历这些集合,并将数据聚合在一起:

import re

s = 'XYZQUACKESTARNFSDMADESBHSCHILDABCD'
matches = re.findall('QUACK|TAR|MAD|CHILD',s)
non_matches = re.split('QUACK|TAR|MAD|CHILD',s)
'-'.join(["{}-({})".format(matches[i], len(non_matches[i+1])) for i in range(len(matches))])
#'QUACK-(2)-TAR-(4)-MAD-(5)-CHILD-(4)'

关于python - 如何从正则表达式匹配中获取索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35328519/

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