当前位置:  开发笔记 > 编程语言 > 正文

正则代数取代的组合产物

如何解决《正则代数取代的组合产物》经验,为你挑选了0个好方法。

我试图通过可选地应用替换来生成字符串变体.

例如,一种替换方案是删除任何空白字符序列.而不是替换所有出现的事件

>>> re.sub(r'\s+', '', 'a b c')
'abc'

- 相反,我需要为每次出现生成两个变体,因为替换是在一个变体中执行,而不是在另一个变体中执行.对于字符串'a b c' 我想要变种

['a b c', 'a bc', 'ab c', 'abc']

即.所有二元决策的叉积(结果显然包括原始字符串).

对于这种情况,可以使用re.finditer和生成变体itertools.product:

def vary(target, pattern, subst):
    occurrences = [m.span() for m in pattern.finditer(target)]
    for path in itertools.product((True, False), repeat=len(occurrences)):
        variant = ''
        anchor = 0
        for (start, end), apply_this in zip(occurrences, path):
            if apply_this:
                variant += target[anchor:start] + subst
                anchor = end
        variant += target[anchor:]
        yield variant

这为上面的例子产生了所需的输出:

>>> list(vary('a b c', re.compile(r'\s+'), ''))
['abc', 'ab c', 'a bc', 'a b c']

但是,此解决方案仅适用于固定字符串替换.re.sub类组引用的高级功能不能像这样完成,如下面的示例,用于在单词内的一系列数字后面插入空格:

re.sub(r'\B(\d+)\B'), r'\1 ', 'abc123def')

如何扩展或更改方法以接受re.sub的任何有效参数(不编写用于解释组引用的解析器)?

推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有