我在这个字母表中有一个字母{A, B, C}
和一个(大)字数:
AAABBCABBCCCCAA, ABBBCCC, BBBBCACAC, ...
(不同的长度,不同的组合)
我正在寻找一组可以描述这些词的正则表达式(越小越好)。我更喜欢紧凑型((BC)+
而不是BCBC
)。这不是家庭作业。
我发现this question是相关的。
更新:当我说(BC)+
超过BCBC
时,我可能会匆匆忙忙。我更喜欢尽可能少的表达式(在最坏的情况下,每个字符串有一个正则表达式),因此首选A+
,AA
或AA+
来表示{{1 (例如)应该取决于其他字符串显示的模式。
答案 0 :(得分:1)
如果我理解你的问题,你就会有一个字母表,以及该字母表中的字符串列表,你想构建一个与这些字符串完全匹配的模式。
您可以为每个字符串构建deterministic finite automata,从non-deterministic finite automata构建所有DFA的组合。然后将DFA简化为NFA。然后只需将NFA转换为模式。
如果不是已经模式化的字符串,这甚至可以工作。但是,无法保证您将获得尽可能小的模式。
答案 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']