Python中使用正则表达式的字符串之间的对应关系

时间:2015-12-30 07:44:02

标签: python regex

我需要一个 Python 中的函数,它接受两个字符串(a, b)和一个对应规则列表,即字符串对(a[i], b[i]),并检查是否可以< strong>分割a部分,根据对应规则替换每个部分并获取b 。问题是规则可能有点纠结:

  1. 可能有(a, b)(a, c)

  2. 等规则
  3. ,例如(aa, b)(a, c)

  4. ,例如(ab, d)(bc, e)

  5. 是通信,而不是替代(a不能离开a或首先转换为b然后再转为c

  6. 例如,如果对应规则为(aa, x)(ab, y)(ab, z),则(aab, anything)(a, anything)不被接受,{{1} },(aa, x)(abab, yz)(abab, yy)(abab, zz),(aaab,xy)`是。

    有没有办法使用 Python 的标准正则表达式库或其他一些常见的正则表达式实现来完成它?我可以通过蛮力来做到这一点,但是要检查很多对都是非常无效的。

1 个答案:

答案 0 :(得分:1)

(为了防止英语完全混淆,我会将你的通信对的元素称为&#34;键&#34;和#34;值&#34;,即使重复的键阻止了它们撰写一个典型的dict。)

我相信只有正则表达式才能做到这一点。

问题1.注册Aren地图

正则表达式无法将由某些键序列组成的字符串与其转换关联到值中。对于初学者来说,re函数需要访问您的键值对列表,只要这样就可以告诉您匹配中出现了哪些键。

问题2:模棱两可的匹配

正则表达式可以通过几种方式处理交替中的模糊匹配,例如:

re.findall(r'(a|aa|aaa)*', 'aaaa')

问题是,对于任何给定的正则表达式,您只能选择一个。您的问题需要跟踪哪些匹配的匹配项,按什么顺序排列,以及每次匹配的次数。

更糟糕的是,您的问题需要了解匹配的替代方案的所有可能组合。但是,一旦正则表达式确定'aaaa'匹配任何重复,例如'a' + 'a' + 'a' + 'a',它就已完成 ---匹配找到。< / p>

还没有完成。您仍然需要测试所有其他匹配项,例如'a' + 'a' + 'aa''a' + 'aa' + 'a''aaa' + 'a',并且......测试这些匹配将导致许多不同的组合将值粘合在一起并与第二个参数进行比较。你不能跳过它们。

勇敢但注定要失败

我创建了一个正则表达式构建函数,可以为一组键值对识别有效的输入和输出字符串。不幸的是,这没有说明给定的输入字符串是否可以实际产生特定的输出。

import re

def is_valid_word(word, alphabet):
    '''
    Returns True if the given word can be assembled from zero or
    more of the strings in the given alphabet.  If word is an
    empty string (''), this is True regardless of strings in the
    alphabet.
    '''
    regex_letters = (re.escape(letter) for letter in alphabet)
    regex_alternatives = '|'.join(regex_letters)
    regex = r'(?:' + regex_alternatives + r')' + r'*' + r'$'
    # regex looks like:  r'(?:a|b|aa|ab|abc)*$'
    pattern = re.compile(regex)
    match = pattern.match(word)
    return match is not None

def is_valid_key_word(word, pairs):
    keys = set(pair[0] for pair in pairs)
    return is_valid_word(word, alphabet=keys)

def is_valid_value_word(word, pairs):
    values = set(pair[1] for pair in pairs)
    return is_valid_word(word, alphabet=values)

这可以快速(?)排除不可能的输入或输出字符串,但它实际上无法解决您的问题,如果有足够的回溯,它会赢得&#39甚至要快。

坚持for循环。