2017-05-01 10 views
1

re.subと同様の文字列の部分文字列を置換するためのpythonic方法を探していますが、見つかったテキストの追加処理があります。これはおそらく純粋な正規表現の構文では実現できますが、非常に迅速に判読できなくなります。部分文字列を追加の処理で置き換えます

これは私が達成するために必要なものです:

入力文字列:text1 (2, 100) text2 (34,23) text3

出力:同じ文字列が、(2, 100)値12と14を使用して、HTMLコードに包まれました。 (34, 23)と同じです。ような何か:re.finditerと一致して

text1 <span data-coord='{"x": 0.02, "y": 1}'>(2, 100)</span> 
text2 <span data-coord='{"x": 0.34, "y": 0.23}'>(34, 23)</span> 
text3 

反復は、論理的な解決策と思われるが、どのように私は、テキストの残りの部分を取得するのですか?

EDIT:数字は0から100

FOOTNOTEの間、3桁のものと分の1かもしれ:私は本当に、xとyのために見つかったグループが私に入力されている解決策を持っていることを好むだろう発見されたグループとの関係を完全に自由にすることができます。例えば。エラー処理を行います:数値が0〜100の範囲外の場合は、赤でハイライトしたい場合があります。私は正規表現の面でもその振る舞いを定義できると確信していますが、私は間違っています:正規表現は数値処理ではなくテキスト処理です。そして、それはコードのロジックをあいまいにします。

答えて

3

あなたが効果的との組み合わせでconvert機能を使用して

import re 

rx = re.compile(r'\((?P<x>\d+),\s*(?P<y>\d+)\)') 

# before 
string = "text1 (12, 14) text2 (34,23) text3" 

def convert(match): 
    return '''<span data-coord='{{"x": 0.{}, "y": 0.{}"}}'>{}</span>'''.format(
      match.group('x'), 
      match.group('y'), 
      match.group(0) 
    ) 

string = rx.sub(convert, string) 

print(string) 
# text1 <span data-coord='{"x": 0.12, "y": 0.14"}'>(12, 14)</span> 
# text2 <span data-coord='{"x": 0.34, "y": 0.23"}'>(34,23)</span> 
# text3 

を使用することができます.format()

+0

これはまさに私が探していたものだと思います。置換パターンの代わりにこの関数を使用することは私には新しく、ドキュメントでは見逃してしまいました。チェックして戻ってきます。 – texnic

+0

@Jan、Ericは、関数sinではなく、関数sin(90°)が数値であることを意味します。この文脈では本当に細かいディテールですが、私は実際に彼の発言に感謝します。私は自分の知識を向上させようと努力しており、関数の使用を引数として強調することは良いことです。 – texnic

+0

@texnic:まさに。 Jan:変更をありがとう、あなたの答えは上質です! –

1

正規表現は非常に単純です:

# two one or more digits separated by comma and none or more spaces, wrapped in parenthesis 
\((\d+),\s*(\d+)\) 

次にあなたがグループでre.subを使用することができます。

>>> re.sub(r'\((\d+),\s*(\d+)\)', r'''<span data-coord='{"x": 0.\g<1>, "y": 0.\g<2>}'>(\g<1>, \g<2>)</span>''', text) 
text1 <span data-coord='{"x": 0.12, "y": 0.14}'>(12, 14)</span> text2 <span data-coord='{"x": 0.34, "y": 0.23}'>(34, 23)</span> text3 
+0

ニースのソリューションは、まだかなり簡単です。だから私は正規表現の世界を離れることについて私の心を変えるかもしれない。しかし、私の質問の編集を見てください。どのように組み込むことができるのだろうか。 – texnic

関連する問題