4

Calibre を使用して PDF を MOBI に変換していますが、スペースでインデントされたコード ブロックの解釈に問題があります。ブロックには多くのスペースが含まれていますが、その量はさまざまです。一部の行は、31 スペース分インデントされています。

Calibre では、書籍が変換される前に、3 つの正規表現で検索と置換を行うことができます。

これは私が試したものです。

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

と置換する:

\n\1 \2\3

問題は、スペースの1つだけを置き換えることです。それらをすべて同じ量の に置き換えてください 

最初のグループなどの遅延バージョンも試しました。

これは正規表現が不十分なケースの 1 つですか? この正規表現エンジンは Python の標準だと思います。

4

3 に答える 3

2

これが Perl の場合は に置き換えることができ(\G|\n) $1&nbsp;(Python のような固定幅の後読みの代わりに) 幅が制限された後読みを許可する正規表現エンジンの場合は(?<=\n {0,30}) &nbsp;;に置き換えることができます。しかし、そのままでは、私が考えることができる唯一の方法は、のようなものを に置き換えること((?<=\n)|(?<=\n )|(?<=\n {2})|(?<=\n {3})|(?<=\n {4})|(?<=\n {5})|...|(?<=\n {30})) です&nbsp;。. . その時点で、Calibre が入力正規表現を許可する時間の制限に達すると思います。:-/

別のオプションは、まったく異なるアプローチを取り、  (2 つのスペース) を&nbsp; (改行なしのスペース + 通常のスペース) に置き換えることです。わざわざ行頭に制限する必要はありません。私はそれがあなたのニーズを満たすと思いますか?

于 2012-03-01T02:39:50.427 に答える
1

すべてのスペースを改行しないスペースに置き換えない理由はありますか? ( r/ /&nbsp;/.)

通常の英語のテキストの外観は変更されず (ソースに不要な二重スペースが含まれている場合を除く)、コード ブロックは正しくレンダリングされます。


楽しみのために、Pythonでの私の試み:

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

アイデアは、一度に 1 つのスペースを置き換えることです。reエンジンは一致後に行の先頭に戻らないため、機能しません。左から右に動作する文字列を消費します。

(?:&nbsp;)*が空文字列 と交互になっていることに注意してください(|(?:&nbsp;)*)。これにより、キャプチャ グループ\1は常に何か(空文字列であっても) をキャプチャします。

于 2012-03-01T02:53:25.197 に答える
1

\s{31} は正確に 31 個の空白、\s{14,31} は 14 ~ 31 個に一致します。

于 2012-03-01T02:31:37.147 に答える