2017-09-29 15 views
0

私は、PythonのRegexでグループの後方参照を使ってそれらを理解しようとしていますが、私はあまり運がありません。PythonのRegexの逆参照に関する問題

import re 

leftQuotes = re.compile("((\"|\“)([\w|\d]))") 
rightQuotes = re.compile("(([\w|\d])(\"|\”))") 

s = "This is “problematic”" 

s = re.sub(leftQuotes, r'‘\3', s) 
s = re.sub(rightQuotes, r'’\3', s) 

print(s) 

出力:この場合には(一致する文字を維持しながら、最初re.sub()では、私は成功し、単一の左引用符と左の二重引用符を置き換えるために管理

This is ‘problemati’” 

、 "p")。しかし、グループの後方参照(1、2、3)にかかわらず、右側は同じように動作しません。後方参照の

結果:

\1: ‘problemati’c” 
\2: ‘problemati’c 
\3: ‘problemati’” 
+0

あなたはそれを過剰キャプチャしました。 's = re.sub(rightQuotes、r '\ 2' '、s)'を使うか、不要なグループを削除して、保持しておかなければグループ1の逆参照を使用しないでください。 –

+0

@WiktorStribiżewこれは私に「これは問題です」と答えています –

+0

@ウィクショナリー投稿記事の中で最初に述べたように、すべての後方参照は望ましくない出力をもたらしました。 \ 1は「これは「problemati'c」です –

答えて

2

で二subを置き換える、あなたのコードを修正するには、次の

s = re.sub(rightQuotes, r'\2’', s) 

作業をする必要があり、第二のパターンで単語文字は、第二として来るので、シングルクォートの置換の前に来なければなりません。


以外にも、あなたが本当にここキャプチャグループを必要としない、は(あなたに@ CasimiretHippolyteさんのコメントなど、いくつかのタイピングを節約することができ、単一引用符で文字列を引用していない重要なものの)、きれいになりを見て回る使用します。

import re 
​ 
leftQuotes = re.compile('(?:"|“)(?=\w)') 
rightQuotes = re.compile('(?<=\w)(?:"|”)') 
​ 
s = "This is “problematic”" 
​ 
s = re.sub(leftQuotes, r'‘', s) 
s = re.sub(rightQuotes, r'’', s) 
​ 
s 
# 'This is ‘problematic’' 

\w\dを含んでいるのでまた、[\w|\d]\wに置き換えることができます。

+0

先読みや見回しの代わりに、単語境界を使用する方が簡単です。 –

+0

@CasimiretHippolyteよろしくお願いします。 – Psidom

+1

私は次のような意味を持っていました: '(?:" | ")\ b'と' \ b(?: "|") ' –

関連する問題