1

sub()に置き換える関数を===Something here===使用しています<h2>Something here</h2>

以下が機能しています:

line = sub(r"(===)([a-zA-Z\s]*)(===)", r"<h2>\2</h2>", line)

元のコンテンツの場所:

===Something here===

ただし、元のコンテンツが次の場合は機能しません。

===
Something here
===

私は次のようなことを試しました:

line = sub(r"(===\n)([a-zA-Z\s]*)(===)", r"<h2>\2</h2>", line)

(唯一の変更点は\n、最初のグループに が追加されたことです)

しかし、パターンのオプションの部分ではなく、パターンに新しい行が含まれていることを強制すると思います。

新しい行が存在する可能性があるインスタンスを認識できるほど柔軟になるように、現在のパターンを拡張するにはどうすればよいですか?

編集:

以下の提案を(執筆時点で)試しましたが、機能していません。私が考えることができる唯一の理由は、その行に他のキャラクターがいる可能性があるからです.

次の画像は、元のテキスト ファイル (「行末」と「空白」を表示するように設定して SciTE エディターで開いたもの) のスクリーンショットです。

original_text_file = open('file.txt', 'U')

単線インスタンス:

ここに画像の説明を入力

マルチライン インスタンス:

ここに画像の説明を入力

これらのキャラクターについて他に考慮する必要があるかどうかはわかりません。

編集 2:

以下の別のソリューションをテストした結果 (これは複数行のインスタンスで置換を実行しませんでした):

パイソンコード:

from re import *

def test_function(text_file):
    file_object = open(text_file+'.txt', 'U')
    for line in file_object:
        line = sub(r"\n?(===)\n?([a-zA-Z\s]*?)\n?(===)\n?\n?", r"<h2>\2</h2>", line)
        print line

test_function('my_file')

my_file.txt:

===Something here===

Lorem ipsum lala.  

===
Something here
===

Loreum ipsum lala.  
4

5 に答える 5

1

私はこの解決策を提案します:

import re
s = """===Something here===

Lorem ipsum lala.  

===
Something here
===

Loreum ipsum lala.  """
result = re.sub(r"===(.*?)===", r"<h2>\1</h2>", s, flags=re.DOTALL)
print result

いくつかの説明:

  • .*?「貪欲でない」モードの任意の文字に一致します。可能な限り少ないデータに一致します。これは、次のように===First=== lalala ===Second===置き換えられることを避けるためです。<h2>First=== lalala ===Second</h2>

  • flags=re.DOTALL改行を含む任意の.文字に一致することを意味します

行ごとではなく、ファイル全体に sub() を適用する必要があることに注意してください

于 2013-05-18T07:57:25.283 に答える
1

ここでは正規表現を使用するのが適切だと思います。あなたの表現は、あなたが必要としていたものに近づいていました。の後に、その前の文字の一致または出現\nが必要でした。この場合は 0 または 1です。これは、改行の可能性に対処するために、いくつかの場所に配置する必要がありました。また、ターゲット キャプチャ グループの がオプションを消費しないようにする必要がありました。?01\n\s\n\n

import re
pat = r'\n?(===)\n?([a-zA-Z\s]*?)\n?(===)\n?\n?'
rep = r'<h2>\2</h2>'

print(repr(re.sub(pat,rep,"""
=== Something here ===
""")))
print(repr(re.sub(pat,rep,"""===
Something here
===""")))

出力

>>> 
'<h2> Something here </h2>'
'<h2>Something here</h2>'

あなたのように設定された Scite からテキストをコピーして貼り付けました。

ここに画像の説明を入力


マルチラインの場合、これをお勧めします:

import re
patSearch = r'\n?===\n?[a-zA-Z\s]*?\n?==='
patReplace = r'\n?(===)\n?([a-zA-Z\s]*?)\n?(===)\n?\n?'
replacement  = r'<h2>\2</h2>'

文字列の場合t:

t="""===Something here===

Lorem ipsum lala.  

===
Something here
===

Loreum ipsum lala."""

以下

matches = re.findall(patSearch,t) #get all the === ... === style string
for match in matches:
    print re.sub(patReplace,replacement,match) #do replacement in each one

生産するだろう

>>> 
<h2>Something here</h2>
<h2>Something here</h2>
于 2013-05-18T02:57:58.553 に答える
0

User1063287、まだ問題がある場合は、Zac が投稿した解決策をお勧めします。私はあなたと同様の問題を抱えていました.「re.DOTALL」フラグは、意図したとおりに交換を行うためのトリックでした. 私の問題には、.txt ファイルからのテキストへのアクセスも含まれていました。私にとって何がうまくいったかに基づいて、特定の問題をコーディングする方法の提案を次に示します(出力を新しい.txtに保存したことに注意してください)

import re
with open('output.txt', "w") as o:
    with open('input', 'r') as i:
        line = i.read()
        line = re.sub(r"===.*?===", r"<h2>\2</h2>", line, flags=re.DOTALL)      
    o.write(line)

with ステートメントを使用すると、ループの完了時に入力ファイルと出力ファイルを閉じることができ、i.read() コマンドを使用すると、(行ごとにアクセスするのではなく) ファイル全体を一度に読み取ることができます。このコードを def 関数に入れられなかった理由はわかりませんが、確認するために試したことはありません。

幸運を!

于 2015-05-15T21:07:02.203 に答える
0

キャプチャ グループの間に空白を追加します。

re.sub(r"(===)\s*([a-zA-Z\s]*?)\s*(===)", r"<h2>\2</h2>", line)

非貪欲なキャプチャ グループを使用することもできます。

re.sub(r"(===)\s*(.*?)\s*(===)", r"<h2>\2</h2>", line)
于 2013-05-18T02:57:30.277 に答える