在jinja2或python中用正则表达式替换字符串中的相同字符序列

时间:2018-08-31 22:08:46

标签: python regex jinja2

我一辈子都想不通如何获得一个正则表达式,用一个与每个实例的重复次数加上重复字符相匹配的数字来替换字符串中所有相同的重复字符。

例如,假设我在输入中包含以下字符串: “ HB ??? B ??? B ??? B ??? B ??? B ??? B ??? B ???”

我希望在输出中得到以下模式: “ HB3?B3?B3?B3?B3?B3?B3?B3?”

我问这个问题是因为我正在使用 jinja2 制作 python 模板。这些python文件使用 struct 标准模块,我需要根据规范自动生成可能的大型结构。我需要一次解压缩所有内容,因为解压缩单个数据的字节对齐会导致我正在使用的某些cpu架构出现问题。

也许我没有想到更好的解决方案。

2 个答案:

答案 0 :(得分:2)

这是使用python re.sub

的解决方案
>>> import re
>>> s = "HB???B???B???B???B???B???B???B???"
>>> re.sub(r'\?+', lambda m: str(len(m.group()))+'?', s)
'HB3?B3?B3?B3?B3?B3?B3?B3?'

答案 1 :(得分:0)

您发布的一个简单问题使语言定义变得不规则...这意味着没有正则表达式可以匹配与某个常规子表达式匹配的文本,并且可以与您匹配相同的字符串之前匹配(这是上下文相关的,因此无法通过正则表达式/有限自动机进行解析-在很多地方都可以进行演示-通过正则表达式/有限自动机进行解析)

但是一切并没有丢失。许多库都允许您使分组可用,因此,您可以创建一个组,然后在同一正则表达式的右侧引用它(表示之前匹配的相同字符串)

从数学上讲,这不是常规语言,与之匹配的表达式也不是常规表达式,但是它可以正常工作,因为它是在unix的早期版本中实现的。

HB(...)\1*

在这里,一组其他通配符(换行符除外)“。”。匹配,然后可以将0或更大的任何序列(根据*运算符)附加到该序列。这样可以匹配

HBABCABCABCABCABCABC

HBBBABBABBABBABBA

但不是

HBBBABBABBABB  (not complete the sequence of three letters BBA)

请参见demo

括号中的子表达式可以是有效的正则表达式。匹配后,通过将\1组替换为匹配的一组来保存正则表达式的其余部分。您可以实现比这还要复杂的事情,唯一的要求是,要在正则表达式中使用组,它必须引用先前在同一正则表达式中已匹配的内容(这意味着组引用必须位于分隔该组号的右括号)