可以描述字符串的正则表达式

时间:2013-02-15 22:04:36

标签: python regex

我在这个字母表中有一个字母{A, B, C}和一个(大)字数:
AAABBCABBCCCCAA, ABBBCCC, BBBBCACAC, ...(不同的长度,不同的组合)

我正在寻找一组可以描述这些词的正则表达式(越小越好)。我更喜欢紧凑型((BC)+而不是BCBC)。这不是家庭作业。

  1. 这样做的好方法是什么?
  2. 是否有Python包已经这样做了?
  3. 我发现this question是相关的。

    更新:当我说(BC)+超过BCBC时,我可能会匆匆忙忙。我更喜欢尽可能少的表达式(在最坏的情况下,每个字符串有一个正则表达式),因此首选A+AAAA+来表示{{1 (例如)应该取决于其他字符串显示的模式。

2 个答案:

答案 0 :(得分:1)

如果我理解你的问题,你就会有一个字母表,以及该字母表中的字符串列表,你想构建一个与这些字符串完全匹配的模式。

您可以为每个字符串构建deterministic finite automata,从non-deterministic finite automata构建所有DFA的组合。然后将DFA简化为NFA。然后只需将NFA转换为模式。

如果不是已经模式化的字符串,这甚至可以工作。但是,无法保证您将获得尽可能小的模式。

我不知道在Python中操纵DFANFA的任何库。

答案 1 :(得分:0)

以下是使用这些单词处理字符串的几种方法,但只有第一种方法需要正则表达式:

strings =['AAABBCABBCCCCAA', 'ABBBCCC', 'BBBBCACAC']

import re
for string in strings:
    matches = re.findall(r'([A-C]+)', string)
    if matches:
        print matches[0]

输出:

AAABBCABBCCCCAA
ABBBCCC
BBBBCACAC

或者你也可以使用这样的东西,这取决于你打算用正则表达式做什么:

from itertools import groupby
results = [(string, [''.join(g) for k, g in groupby(string)]) for string in strings]
print
for result in results:
    print '{}: {}'.format(*result)

输出:

AAABBCABBCCCCAA: ['AAA', 'BB', 'C', 'A', 'BB', 'CCCC', 'AA']
ABBBCCC: ['A', 'BBB', 'CCC']
BBBBCACAC: ['BBBB', 'C', 'A', 'C', 'A', 'C']