例如,我们如何使用单个 RE 识别以下格式的字符串:
LenOfStr:Str
这种格式的示例字符串是:
5:5:str
我们要查找的字符串是“5:str”。
在 python 中,可能类似于以下内容(这不起作用):
r'(?P<len>\d+):(?P<str>.{int((?P=len))})'
一般来说,有没有办法在使用之前更改以前匹配的组,或者我只是问了另一个不适合 RE 的问题。
谢谢。
是的,您所描述的超出了正则表达式的范围。正则表达式只处理实际的字符数据。这提供了一些有限的根据上下文进行匹配的能力(例如,(.)\1
匹配相同的字符两次),但是您不能将任意函数应用于正在进行的匹配的片段并稍后在相同的匹配中使用结果。
您可以执行诸如搜索与 regex 匹配的文本之类的操作(\d+):\w+
,然后对结果进行后处理以检查字符串长度是否等于匹配第一部分的 int 值。但是您不能将其作为匹配过程本身的一部分。
那么这可以用正则表达式来完成(如果我理解这个问题):
>>> s='5:5:str and some more characters...'
>>> m=re.search(r'^(\d+):(.*)$',s)
>>> m.group(2)[0:int(m.group(1))]
'5:str'
只是不能通过动态更改前一个匹配组来完成。
你可以让它像一个单一的正则表达式一样像这样:
>>> re.sub(r'^(\d+):(.*)$',lambda m: m.group(2)[0:int(m.group(1))],s)
'5:str'