0

re.sub()Pythonの関数で奇妙な動作に直面しています。

文字列では、次のようなすべての出現を置き換えたい

- list 1
- list 2

のような HTML コードで

<li>list 1</li>
<li>list 2</li>

だから私は使う

text = re.sub('(- (?P<id>.))', '<li>\g<id></li>', text)

それは動作し、戻ります

<li>l</li>ist 1
<li>l</li>ist 2

次に、文全体に一致するように正規表現を追加+します(つまり、「リスト1」、「リスト2」)

text = re.sub('(- (?P<id>.+))', '<li>\g<id></li>', text)

そして驚くべきことに、それは戻ってきます

</li>ist 1
</li>ist 2

後のテキスト\g<id>は、文字列の左側の部分をオーバーライドしています。

<li>\g<id>foo代わりに試してみると、返されますfoot 1

あなたたちはすでにこの行動に直面していましたか?私がここに欠けているものはありますか?

ありがとう

4

1 に答える 1

2

入力ファイルには'\r'、行末にキャリッジ リターン ( ) があります。したがって、最初の入力行は次のようになります。

 - list 1\r\n

\rカーソルを現在の行\nの先頭に移動し、次の行の先頭に移動するので、その文字列と気付かないことができますprint

置換後、行は次のようになります。

<li>list 1\r</li>\n

これにより、</li>印刷時に現在の行の先頭に表示されます。

考えられる解決策がいくつかあります。

  • \rオン入力を取り除く
  • \r一致する文字クラスから除外する

最初の例は、.txt でテキスト ファイルを開くことですopen(fname, 'rU')

2 番目の例は次のようになります。re.sub('(- (?P<id>[^\r\n]+))', '<li>\g<id></li>', text)

于 2013-03-13T15:09:53.370 に答える