我正在寻找针对我的问题的更多Python或函数式编程解决方案。
我regular expression
将a匹配到字符串。正则表达式在每个通配符重复周围捕获一个组。我使用这些组来掩盖比赛中的通配符。以下代码显示了一个示例:
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.split
,并str.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)'
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句