2

I have a question about regular expression sub in python. So, I have some lines of code and what I want is to replace all floating point values eg: 2.0f,-1.0f...etc..to doubles 2.0,-1.0. I came up with this regular expression '[-+]?[0-9]*\.?[0-9]+f' and it finds what I need but I am not sure how to replace it?

so here's what I have:

# check if floating point value exists
if re.findall('[-+]?[0-9]*\.?[0-9]+f', line):
    line = re.sub('[-+]?[0-9]*\.?[0-9]+f', ????? ,line)

I am not sure what to put under ????? such that it will replace what I found in '[-+]?[0-9]*\.?[0-9]+f' without the char f in the end of the string.

Also there might be more than one floating point values, which is why I used re.findall

Any help would be great. Thanks

4

3 に答える 3

7

キャプチャ グループに保存するテキストの一部をキャプチャし、\1置換演算子を使用します。

line = re.sub(r'([-+]?[0-9]*\.?[0-9]+)f', r'\1' ,line)

パターン自体を検索し、一致がない場合は文字列を変更せずに返すため、findall(または任意の種類の検索) は不要であることに注意してください。re.sub

さて、いくつかの正規表現の書き方のヒント:

  • 正規表現と置換文字列には常に生の文字列 ( r'...') を使用してください。そうしないと、Python の文字列パーサーからエスケープするためにバックスラッシュを 2 つ使用する必要があります。は Python 文字列のエスケープ シーケンスの一部ではないため\.、に対してこれを行う必要がなかったのは偶然です。.

  • \dの代わりに[0-9]数字を一致させるために使用します。それらは同等ですが\d、「数字」の方が認識しやすいですが、[0-9]視覚的に確認する必要があります。

  • 正規表現は を認識しません10.f。これは、入力の有効な 10 進数である可能性があります。さまざまな形式の浮動小数点数を一致させることは、最初に思われるよりも難しいですが、単純なグーグル検索で、これに対する合理的に完全な解決策が多数明らかになります。

  • フラグを使用すると、re.X任意の空白やコメントを正規表現に追加できます。まったくばかげているように見える小さな正規表現ですが、大きな式の場合、追加された明快さは命の恩人です。(正規表現がしきい値に近づいています。)

上記のスタイル ヒントを実装する拡張正規表現の例を次に示します。

line = re.sub(r'''
    ( [-+]?
      (?: \d+ (?: \.\d* )?    # 12 or 12. or 12.34
          |
          \.\d+               # .12
      )
    ) f''',
    r'\1', line, flags=re.X)

((?:...)は非キャプチャ グループであり、優先順位のためにのみ使用されます。)

于 2012-09-19T17:09:02.627 に答える
1

これは、正規表現に関するすべての参照先です。

http://www.regular-expressions.info/named.html

結果は次のようになります。

line = re.sub('(<first>[-+]?[0-9]*\).?[0-9]+f', '\g<first>', line)
于 2012-09-19T17:10:43.763 に答える
1

「キャプチャグループ」に「保持」したい正規表現の部分を囲みます。

'([-+]?[0-9]*\.?[0-9]+)f'
 ^                    ^

そして\1、置換で使用してこれらのキャプチャ グループを参照できます。

r'\1'

後で参照できるように、左括弧の順序で 、 などの多くのキャプチャ グループを使用でき\2ます\3

于 2012-09-19T17:10:59.367 に答える