2017-01-25 6 views
0
import re 
p2b = open('repattern2b.txt').read().rstrip() 

科学的表記で書かれた数字を表す文字列に一致する正規表現パターンを書く必要があります。しかし、このパターンに加えて、グループ1が仮数の符号であることを保証する(符号がある場合)。グループ2は仮数ですが、0でない場合に限ります(この例外はパターンを単純化します)。グループ3は指数です。例えば正規表現を修正するには

:その後、

m = re.match(the pattern,’9.11x10^-31’) 

m.groupsの場合は、()は、複数のグループがあってはならない

(None, '9.11', '-31'). 

です。

以下

私は「repattern2b.txt」のために書いた正規表現です:

^([+-]?)([1-9].[0-9]+)x10^([1-9][0-9]*)$ 

しかし、私はエラーを得た:

54 *Error: re.match(p2b,'0').groups() raised exception; unevaluated: (None, None, None) 
55 *Error: re.match(p2b,'5').groups() raised exception; unevaluated: (None, '5', None) 
56 *Error: re.match(p2b,'5.0').groups() raised exception; unevaluated: (None, '5.0', None) 
57 *Error: re.match(p2b,'5.2x10^31').groups() raised exception; unevaluated: (None, '5.2', '31') 
58 *Error: re.match(p2b,'5.2x10^-31').groups() raised exception; unevaluated: (None, '5.2', '-31') 
59 *Error: re.match(p2b,'5.2x10^+31').groups() raised exception; unevaluated: (None, '5.2', '+31') 
60 *Error: re.match(p2b,'-5.2x10^-31').groups() raised exception; unevaluated: ('-', '5.2', '-31') 

私の正規表現は、例外を発生させているようですが、私理由は分かりません。誰かが私にそれを解決する助けてもいいですか?前もって感謝します。

+0

通常、正規表現は例外自体を発生させません。あなたはそれを文字列にしてもよろしいですか? –

+0

はい、私はそう思っていますが、それは問題の原因となるグループかもしれませんが、私は確信していません – zhangdi

答えて

0

例外は、re.matchNoneを返すためです。その後、None.groups()にアクセスすることはできません。

すべての理由でNoneを返すのはなぜですか? の真中に、行の先頭を示す正規表現で^があります。たとえば、式の始めに正確に使用します。

が比較:

>>> re.match(r"^([+-]?)([1-9].[0-9]+)x10^([1-9][0-9]*)$",'5.2x10^31') 
None 

で:

>>> re.match(r"^([+-]?)([1-9].[0-9]+)x10\^([1-9][0-9]*)$",'5.2x10^31') 
<_sre.SRE_Match object; span=(0, 9), match='5.2x10^31'> 
+0

こんにちは、それを変更した後、re.match(p2b、 '5.2x10^31')。groups()例外は残されていますが、残りのケースでは例外が発生しています。 – zhangdi

+0

はい...しかし、あなたの表現には他の問題がありました... – donkopotamus

0

テストデータと正規表現を比較すると、いくつかの問題があります。

  • 指数のプラス/マイナスではありません正規表現で
  • ^番目文字列のEの真ん中が
  • をエスケープされていない10^...は、データ中に存在しない場合がありますが、それは正規表現で
  • である第一.は、データに存在しない場合がありますが、それは正規表現で
  • です記号は

が欠落しているときにNoneをしたい場合は、最初のプラス/マイナスの後に疑問符がたぶんこの作品グループ外にする必要があります

import re 

p2b = '^([+-])?(([1-9].?[0-9]*)|0)(x10\^([+-]?[1-9][0-9]*))?$' 

for s in ['-5.2', '+1.2', '0', '5.', '5.0', 
      '5.2x10^31', '5.2x10^-31', '5.2x10^+31', '-5.2x10^-31']: 
    try: 
     a = re.match(p2b, s).groups() 
     a = (a[0], a[2], a[4]) 
     print s, ": ", a 
    except Exception as e: 
     print s, ": ", e 

は、ここではいくつかの説明です:

p2b = re.compile(r""" 
     ^      # start of line 
     ([+-])?     # maybe a sign 
     (
      (
       [1-9].?[0-9]* # accept 1, 2, 5., 5.2, not 0 
      ) | 0    # 0 will not be in a group 
     ) 
     ( 
      x10\^    # the x10... will be skipped later 
       (
       [+-]?   # exponent might have a sign 
       [1-9][0-9]* # one or more digits, not starting with 0 
      ) 
     )?      # The x10... might be missing 
     $      # end of line 
     """, re.VERBOSE) 

これが出力されます。

-5.2 : ('-', '5.2', None) 
+1.2 : ('+', '1.2', None) 
0 : (None, None, None) 
5. : (None, '5.', None) 
5.0 : (None, '5.0', None) 
5 : (None, '5', None) 
15 : (None, '15', None) 
5.2x10^31 : (None, '5.2', '31') 
5.2x10^-31 : (None, '5.2', '-31') 
5.2x10^+31 : (None, '5.2', '+31') 
-5.2x10^-31 : ('-', '5.2', '-31') 

a[2]'x10^-31'を含んでいるでしょうが、私はそれをスキップし、確かに優れたソリューションがあります。

+0

あなたのコードは素晴らしいですが、問題は1つだけです。 0:(None、 '0'、None)の代わりに(None、None、None) – zhangdi

関連する問題