正则表达式取决于先前的匹配

时间:2012-09-02 21:31:47

标签: python regex

例如,我们如何通过单个RE识别以下格式的字符串:

LenOfStr:Str

此格式的示例字符串是:

5:5:str

我们要找的字符串是“5:str”。

在python中,可能类似于以下内容(这不起作用):

r'(?P<len>\d+):(?P<str>.{int((?P=len))})'

一般来说,有没有办法在使用它们之前更改先前匹配的组,或者我刚问了另一个不适用于RE的问题。

感谢。

2 个答案:

答案 0 :(得分:2)

是的,您所描述的内容超出了正则表达式的范围。正则表达式仅处理实际的字符数据。这提供了一些有限的能力使匹配依赖于上下文(例如,(.)\1以匹配相同的字符两次),但是您不能将任意函数应用于正在进行的匹配的片段并且稍后在同样的比赛。

您可以执行类似搜索与正则表达式(\d+):\w+匹配的文本,然后对结果进行后处理以检查字符串长度是否等于匹配的第一部分的int值。但是你不能把它作为匹配过程本身的一部分。

答案 1 :(得分:0)

这个可以用正则表达式完成(如果我理解了这个问题):

>>> s='5:5:str and some more characters...'
>>> m=re.search(r'^(\d+):(.*)$',s)
>>> m.group(2)[0:int(m.group(1))]
'5:str'

无法通过动态更改上一个匹配组来完成。

你可以将它像 lool 一样像单个正则表达式那样:

>>> re.sub(r'^(\d+):(.*)$',lambda m: m.group(2)[0:int(m.group(1))],s)
'5:str'