如何使用regex替换一定量的空白?

2024-05-20 13:17:11 发布

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

我使用Calibre将PDF转换为MOBI,但是它在解释空格缩进的代码块时遇到了困难。这些块包含很多空格,但数量不同。有些行甚至缩进了31个空格。在

Calibre允许3个正则表达式在转换之前在书中进行搜索和替换。在

这就是我试过的。在

\n( *) ( *)([a-zA-Z{};\*\/\(\)&#0-9])

替换为:

^{pr2}$

问题是,它只替换了一个空格。我要用相同的 替换它们。在

我也试过第一组的懒惰版本等等

这是正则表达式不足的情况之一吗?我认为这个regex引擎是python的标准。在


Tags: 代码引擎版本标准数量pdfmobi情况
3条回答

\s{31}将精确匹配31个空格,\s{14,31}14到31

如果这是Perl,您可以将(\G|\n) 替换为$1&nbsp;,如果它是一个允许有限宽度lookbehind(而不是像Python那样的固定宽度lookbehind)的regex引擎,则可以将(?<=\n {0,30}) 替换为&nbsp;;但事实上,我能想到的唯一方法是将((?<=\n)|(?<=\n )|(?<=\n {2})|(?<=\n {3})|(?<=\n {4})|(?<=\n {5})|...|(?<=\n {30})) 替换为{}。我怀疑在这一点上,Calibre允许输入regex的长度将达到一个极限。:-/

另一个选择是采用完全不同的方法,将(两个空格)替换为&nbsp; (非中断空格+正则空格),而不必费心将其限制在行的开头。我猜那能满足你的需要吗?在

有什么理由不把所有的空格都换成不间断的空格?(r/ /&nbsp;/。)

它不会改变普通英语文本的外观(除非源代码有额外的双空格),并且代码块将正确呈现。在


为了好玩,我在Python中的尝试:

>>> eight_spaces = "        hello world!"
>>> re.sub(r"^(|(?:&nbsp;)*)\s",r"\1&nbsp;",eight_spaces)
'&nbsp;      hello world!'

这个想法是一次替换一个空间。它不起作用是因为re引擎在匹配后没有返回到行的开头-它从左到右使用字符串。在

{{cd4>捕获空的字符串

相关问题 更多 >