我正在使用Calibre将PDF转换为MOBI,但它无法解释空间缩进的代码块。这些块包含很多空格,但是有很多不同的空间。有些行甚至缩进了31个空格。
Calibre允许3个正则表达式在转换之前在书中进行搜索和替换。
这就是我尝试过的。
\n( *) ( *)([a-zA-Z{};\*\/\(\)�-9])
替换为:
\n\1 \2\3
问题是,它只替换其中一个空格。我希望它们全部替换为
。
我也尝试过第一组懒人版等。
这是正则表达式不足的情况吗?我认为这个正则表达式引擎是python标准。
答案 0 :(得分:2)
如果这是Perl,你可以用(\G|\n)
替换$1
,如果它是一个允许有限宽度的lookbehinds的正则表达式引擎(而不是像Python这样的固定宽度的lookbehinds)你可以用(?<=\n {0,30})
替换
;但事实上,我能想到的唯一方法是用((?<=\n)|(?<=\n )|(?<=\n {2})|(?<=\n {3})|(?<=\n {4})|(?<=\n {5})|...|(?<=\n {30}))
代替
。 。 。而且我怀疑在那时你将达到Calibre允许输入正则表达式多长时间的限制。 : - /
另一种选择是采用完全不同的方法,并将
(两个空格)替换为
(非破坏空间+常规空间),而无需将其限制在开头一条线。我猜这会满足你的需求吗?
答案 1 :(得分:1)
\ s {31}恰好匹配31个空格,\ s {14,31} 14到31
答案 2 :(得分:1)
有什么理由不用非破坏空格替换所有空格? (r/ / /
。)
它不会改变普通英文文本的外观(除非源具有额外的双空格),并且您的代码块将正确呈现。
为了好玩,我在Python中的尝试:
>>> eight_spaces = " hello world!"
>>> re.sub(r"^(|(?: )*)\s",r"\1 ",eight_spaces)
' hello world!'
这个想法是一次更换一个空间。它不起作用,因为re
引擎在匹配后不会返回到行的开头 - 它会消耗从左到右工作的字符串。
请注意(?: )*
与空字符串(|(?: )*)
的交替,以便捕获组\1
始终捕获某些内容(即使是空字符串。)