使用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']
,那么我认为打字员的意思是'零'而不是'哦'并进行适当的修正
答案 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..');