2017-03-29 7 views
-1

私はPythonの初心者で、re.subで正規表現を使用したいと思います。私はregex101で試してみました。何とか私は私のpython(バージョン3.6)でそれを使用しようとしたとき、正しく動作しません。私はあなたを想定Pythonの条件がre.sub

re = r"(?(?=[^\t]*)([\t]+))"; 
str = 'a   bold, italic,   teletype'; 
subst = ','; 

result = re.sub($re, $subst, $str); 
+0

は 'Regex101の左パンネルでpython'を選択してください。 – Delgan

+0

私はそれをしましたが、それでも警告を出します。 – Honza

+1

Pythonは正規表現の変数やスラッシュに '$'文字を使用しません。投稿したものが実際に実行されることは確実ですか? – languitar

答えて

0

問題は、Python reの条件付き構文ではルックアラウンドを使用できないということです。以前のグループが一致したかどうかをテストするグループIDだけをキャプチャします。 (?(id/name)yes-pattern|no-pattern)

は、与えられた IDまたは名前のグループが存在する場合は yes-patternと一致しようとします、そして no-patternとそれがない場合。 no-patternは省略可能で省略することができます。

正規表現では、現在の場所にタブ以外の0個以上の文字があるかどうかをチェックし、そうであれば1個以上のタブに一致してキャプチャします。これは意味がありません。 1つ以上のタブが最初に出現した場合は、re.subのパターンを"\t+"とし、count=1という引数を使用します。

import re 
reg = "\t+"; 
s = 'a   bold, italic,   teletype'; 
result = re.sub(reg, ',', s, count=1); 
print(result); 

Python demo

+0

あなたの答えをありがとう! :) – Honza

1

:私はこれが私のコードである

位置5

で次の警告

悪い文字のグループ名に '?= [^ \ tの] *' を取得しますこれを行うことができます:

import re 

regex = r'(^\w*?[\t]+)' 
s = 'a  bold, italic,   teletype' 

def repl(match): 
    s = match.group(0) 
    return s.rstrip() + ', ' 

print(re.sub(regex,repl, s)) 

から

a, bold, italic,   teletype 

ここでは、最初の単語の後に出現する可能性のあるタブを介して文字列の先頭をキャプチャし、一致を呼び出し可能に渡しています。呼び出し可能関数は末尾のタブをrstripで削除し、末尾にカンマを追加します。

注:最初の単語の後に最初のタブがある場合は置き換えられません。すなわち'a bold, italic, teletype'は変更されません。それはあなたが欲しいものですか?

+0

ありがとうございました!このコードでrstrip()を使用する理由は何ですか? :) – Honza

+1

私の答えに追加の解説を見てください。 – Crispin