10

文字列からすべての整数と整数 (他の多くのものの中でも) を検出しようとしています。現在使用している正規表現は次のとおりです。

整数:r"[0-9]+"

整数:r"[+,-]?[0-9]+"

問題は次のとおりです。

  1. 整数の正規表現も負の数を検出していますが、これはあり得ません。これを解決するにはどうすればよいですか?正規表現の開始前にスペースを使用すると、正の数しか得られませんが、出力の開始時にスペースが得られます!
  2. 整数の場合、形式で正の数を検出したいのです+[0-9]が、符号なしで保存したいと思います。
  3. 整数の場合、元の文字列に存在するかどうかに関係なく、符号で検出された正の整数を保存したいと思います。

これでほぼ完了です。最後に、「10 と -15 を足す」という文字列があります。整数をリストに格納したい。これには findall() を使用します。数字を保存している間、「10」を「+10」として保存することができます

4

2 に答える 2

28

正の整数の場合は、次を使用します

r"(?<![-.])\b[0-9]+\b(?!\.[0-9])"

説明:

(?<![-.])   # Assert that the previous character isn't a minus sign or a dot.
\b          # Anchor the match to the start of a number.
[0-9]+      # Match a number.
\b          # Anchor the match to the end of the number.
(?!\.[0-9]) # Assert that no decimal part follows.

符号付き/符号なし整数の場合は、次を使用します

r"[+-]?(?<!\.)\b[0-9]+\b(?!\.[0-9])"

単語の境界\bは、数値全体が一致していることを確認するために重要です。

于 2013-05-27T13:20:36.427 に答える
4

あなたはほとんどそれを持っていました。

import re

regex = re.compile(r'(\d+)|([\+-]?\d+)')

s = "1 2 3 4 5 6 +1 +2 +3 -1 -2 -3 +654 -789 321"
for r in regex.findall(s):
    if r[0]:
        # whole (unsigned)
        print 'whole', r[0]
    elif r[1]:
        # a signed integer
        print 'signed', r[1]

結果:

>>> 
whole 1
whole 2
whole 3
whole 4
whole 5
whole 6
signed +1
signed +2
signed +3
signed -1
signed -2
signed -3
signed +654
signed -789
whole 321

または、「または」を使用して、「より良い」方法で実際の結果を取得することもできます。

print [r[0] or r[1] for r in regex.findall(s)]
>>> 
['1', '2', '3', '4', '5', '6', '+1', '+2', '+3', '-1', '-2', '-3', '+654', '-789', '321']

編集:あなたの質問によると、 「「10」を「+10」として保存することは可能ですか 」:

import re

def _sign(num):
    if r[0]:
        return '+%s'%r[0]
    else:
        return r[1]

regex = re.compile(r'(\d+)|([\+-]?\d+)')
s = "1 2 3 4 5 6 +1 +2 +3 -1 -2 -3 +654 -789 321"      
print [_sign(r) for r in regex.findall(s)]
>>>
['+1', '+2', '+3', '+4', '+5', '+6', '+1', '+2', '+3', '-1', '-2', '-3', '+654', '-789', '+321']

または1行で:

print ['+%s'%r[0] if r[0] else r[1] for r in regex.findall(s)]
>>> 
['+1', '+2', '+3', '+4', '+5', '+6', '+1', '+2', '+3', '-1', '-2', '-3', '+654', '-789', '+321']
于 2013-05-27T13:22:17.680 に答える