Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用jinja2或python中的正则表达式替换字符串中相同的字符序列_Python_Regex_Jinja2 - Fatal编程技术网

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

用jinja2或python中的正则表达式替换字符串中相同的字符序列,python,regex,jinja2,Python,Regex,Jinja2,我一辈子都想不出如何得到一个正则表达式,它用一个匹配重复次数加上每个实例的重复字符的数字来替换字符串中所有相同的重复字符 例如,假设输入中有以下字符串: “血红蛋白B???B???B???B???B???B???B???B???” 我希望在输出中获得以下模式: “HB3?B3?B3?B3?B3?B3?B3?B3?B3?” 我问这个问题是因为我正在使用jinja2制作python模板。这些python文件使用struct标准模块,我需要根据规范自动生成可能的大型结构。我需要一次性解包,因为解包单个

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

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

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

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


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

这里有一个使用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

但不是

HBBBABBABBABB  (not complete the sequence of three letters BBA)

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

HBBBABBABBABB  (not complete the sequence of three letters BBA)