开始时匹配的正则表达式&结束的长度相同

时间:2012-05-06 06:21:14

标签: python regex

当开头和结尾长度相同时,如何制作匹配的正则表达式? 例如

>>> String = '[[A], [[B]], [C], [[D]]]'
>>> Result = re.findall(pattern, String)
>>> Result
>>> [ '[A]', '[[B]]', '[C]', '[[D]]' ]

目前我使用模式\[.*?\],但结果是

>>> ['[[A]', '[[B]', '[C]', '[[D]']

提前致谢。

3 个答案:

答案 0 :(得分:4)

您可以为有限数量的开头/结尾字符定义这样的正则表达式(例如,“如果它以1开头和结尾,或者以2开头和结尾,或者等等”)。但是,您无法为无限数量的字符执行此操作。这只是正则表达式的一个事实。正则表达式是有限状态机的语言,有限状态机不能计数;至少需要一个下推 - 自动机(无上下文语法)的力量。

简单地说,一个正则表达式可以说:“我看到 x 然后我看到了 y ”但它不能说“我看到了 x 然后我看到 y 的次数相同“因为它不记得它看到 x 多少次。

但是,您可以使用Python编程语言的全部功能轻松完成此操作,这是Turing-complete!图灵完整的语言绝对可以计算:

>>> string = '[[A], [[B]], [C], [[D]]]'
>>> sameBrackets = lambda s: len(re.findall('\[',s)) == len(re.findall('\]',s))
>>> filter(sameBrackets, string.split(", "))
['[[B]]', '[C]']

答案 1 :(得分:3)

你做不到。遗憾。

Python的正则表达式是“有限状态自动机”的扩展,它只允许在扫描字符串进行匹配时保留有限数量的内存。此示例需要任意数量的内存,具体取决于重复次数。

Python允许的不仅仅是有限状态的唯一方法是使用“反向引用”,它允许您匹配以前匹配的字符串部分的相同副本 - 但它们不允许您匹配某些内容,比方说,字符数相同。

你应该尝试手写这个。

答案 2 :(得分:0)

要匹配平衡括号,您需要recursive regular expression。股票re模块不支持此语法,但替代regex执行:

import regex

r = r'\[(([^\[\]]+)|(?R))*\]'

print regex.match(r, '[[A], [[B]], [C], [[D]] ]') # ok
print regex.match(r, '[[A], [[B]], [C , [[D]] ]') # None

该表达式基本上表示:匹配括号括起来的东西,其中“某些东西”是一系列非括号([^\[\]]+)或整个事物(?R)