在jinja2或python中用regex替换字符串中的相同字符序列

2024-05-19 16:10:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我一辈子都搞不懂如何得到一个正则表达式,用一个匹配重复次数加上每个实例的重复字符的数字来替换字符串中所有相同的重复字符。你知道吗

例如,假设输入中有以下字符串: “血红蛋白???B???B???B???B???B???B???B你知道吗

我希望在输出中获得以下模式: “HB3?B3?B3?B3?B3?B3?B3?B3?“你知道吗

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

也许有一个更好的解决办法我没有想到。你知道吗


Tags: 模块文件实例字符串规范模板jinja2标准
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?'

一个简单的问题,你已经张贴,使语言定义不规则。。。这意味着没有正则表达式可以匹配与某个正则子表达式匹配的文本,并且能够匹配与您之前匹配的相同的精确字符串(这是一种上下文依赖性,因此无法通过正则表达式/有限自动机进行解析-在许多地方都有演示)

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

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

HB(...)\1*

这里,匹配一组wilcard字符(除换行符“.”之外的任何字符),然后可以将0或更多的任何序列(根据*运算符)附加到它。这将符合

HBABCABCABCABCABCABC

或者

HBBBABBABBABBABBA

但不是

HBBBABBABBABB  (not complete the sequence of three letters BBA)

demo

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

相关问题 更多 >