簡體   English   中英

在jinja2或python中用正則表達式替換字符串中的相同字符序列

[英]Replacing same sequences of characters in a string with regex in jinja2 or python

我一輩子都想不通如何獲得一個正則表達式,用一個與每個實例的重復次數加上重復字符相匹配的數字來替換字符串中所有相同的重復字符。

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

我希望在輸出中得到以下模式:“ HB3?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*

在此,一組其他通配符(換行符除外)“。”。 匹配,然后可以將0或更大的任何序列(按照*運算符)附加到該序列。 這將匹配像

HBABCABCABCABCABCABC

要么

HBBBABBABBABBABBA

但不是

HBBBABBABBABB  (not complete the sequence of three letters BBA)

觀看演示

括號中的子表達式可以是有效的正則表達式。 匹配后,將\\1組替換為匹配的組,將其保存以組成其余的正則表達式。 您可以實現比這還要復雜的事情,唯一的要求是,要在正則表達式中使用組,它必須引用先前在同一正則表達式中已匹配的內容(這意味着組引用必須位於限定該組號的右括號)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM