如何使用正则表达式替换一定数量的空格?

时间:2012-03-01 02:24:46

标签: python regex calibre

我正在使用Calibre将PDF转换为MOBI,但它无法解释空间缩进的代码块。这些块包含很多空格,但是有很多不同的空间。有些行甚至缩进了31个空格。

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

这就是我尝试过的。

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

替换为:

\n\1 \2\3

问题是,它只替换其中一个空格。我希望它们全部替换为 

的相同数量

我也尝试过第一组懒人版等。

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

3 个答案:

答案 0 :(得分:2)

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

另一种选择是采用完全不同的方法,并将  (两个空格)替换为&nbsp; (非破坏空间+常规空间),而无需将其限制在开头一条线。我猜这会满足你的需求吗?

答案 1 :(得分:1)

\ s {31}恰好匹配31个空格,\ s {14,31} 14到31

答案 2 :(得分:1)

有什么理由不用非破坏空格替换所有空格? (r/ /&nbsp;/。)

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


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

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

这个想法是一次更换一个空间。它不起作用,因为re引擎在匹配后不会返回到行的开头 - 它会消耗从左到右工作的字符串。

请注意(?:&nbsp;)*与空字符串(|(?:&nbsp;)*)的交替,以便捕获组\1始终捕获某些内容(即使是空字符串。)