如何匹配Python迭代器中的对象模式?

时间:2014-08-27 04:22:15

标签: python regex

使用Python re函数来匹配和操作文本中的模式非常容易,例如:

re.match('a[efg]*c', 'aggggc')

如何在列表或其他python迭代器上执行相同的操作?例如,我可能有一个如下所示的列表:

>>> list = ['foo', 'bar', 3, (1, 2, 3), 'a', 'b', {5, 6, 7}, 'apple']

而且,按照正则表达式的惯用法,我可能希望匹配这样的模式:

>>> pattern = ['a', '[', {7, 6, 5}, 'b', 'c', ']', '*', 'apple']

我希望在此列表中找到匹配项。如果它是正则表达式,我会这样写:

>>> match = re.search(pattern, list)
>>> match.group(0)
['a', 'b', {5, 6, 7}, 'apple']

但是,当然,它不起作用,因为Python正则表达式希望看到一个字符串。

我该怎么做?

注意:它能够匹配我正在寻找的模式,而不是这种确切的语法。我想,理想的答案是模块或库(或简洁的函数),它提供了各种在列表上工作的正则表达式样式匹配工具。

解释为什么我想要这个:我正在编写脚本来处理使用复杂脚本的SE-Asian语言的文本。我正在处理的程序将智能地纠正输入错误(这种语言具有可以在上方,下方,前方,周围等处的字符,并且具有关于它们可以发生在哪种顺序的特定规则)。我程序的第一遍使用状态机将每个字符分配给一个类,如辅音,元音,音调,数字等。第二遍将尝试纠正无效的音节和其他类型的错误。就音节位而言,英语中没有类比,但在数字中,假设我看到模式['number', 'o', 'number'],那么我认为打字员的意思是'零'而不是'哦'并进行适当的修正

2 个答案:

答案 0 :(得分:0)

您可以执行此类操作,并在尝试匹配之前检查该项目是否为str

import re
from collections import Iterable

pattern = re.compile('a[efg]*')
items = ['foo', 'bar', 3, (1, 2, 3), 'a', 'b', {5, 6, 7}, 'apple']

def _find_matches(it, pattern):
    matches = []
    for i in it:
        if isinstance(i, str):
            m = pattern.match(i)
            if m:
                matches.append(m)
        elif isinstance(i, Iterable):
            m = _find_matches(i, pattern)
            matches.extend(m)
        else:
            print "Could not process: {}".format(i)
    return matches

results = _find_matches(items, pattern)

答案 1 :(得分:0)

大多数情况下,您需要编写一个函数来检查它。有点像这样。

import sys


my_list =  ['foo', 'bar', 3, (1, 2, 3), 'a', 'b', {5, 6, 7}, 'apple']
pattern = ['fo', 'bar', 3, (1, 2, 3), 'a', '*', {5, 6, 7}, 'apple']


if len(my_list) != len(pattern):
    print('List length dose not match with the pattern')
    sys.exit(1)

for offset,value in enumerate(my_list):
    if pattern[offset] != value and pattern[offset] != '*':
        print('Pattern matching failed at offset {} with value {}'.format(offset, my_list[offset]))
        break;
else:
    print('Pattern matched perfectly..');