Python 如何修复正则表达式

Python 如何修复正则表达式,python,Python,我需要编写一个正则表达式模式来匹配用科学记数法编写的表示数字的字符串。但是除了这个模式,确保第1组是尾数的符号(如果有符号);第2组是尾数,但前提是它不是0(该异常使模式更简单);第3组为指数 例如:如果 import re p2b = open('repattern2b.txt').read().rstrip() 那么m.groups()是 不应该有更多的团体 下面是我为“repattern2b.txt”编写的正则表达式: (None, '9.11', '-31'). 但我得到了一个错误

我需要编写一个正则表达式模式来匹配用科学记数法编写的表示数字的字符串。但是除了这个模式,确保第1组是尾数的符号(如果有符号);第2组是尾数,但前提是它不是0(该异常使模式更简单);第3组为指数

例如:如果

import re
p2b = open('repattern2b.txt').read().rstrip()
那么m.groups()是

不应该有更多的团体

下面是我为“repattern2b.txt”编写的正则表达式:

(None, '9.11', '-31'). 
但我得到了一个错误:

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

我的正则表达式似乎引发了一个例外,但我不知道为什么。有人能帮我修一下吗?提前感谢。

一个例外是,您的
re.match
正在返回
None
。然后无法访问
None.groups()

为什么它会返回所有的
None
<强> >在表达式 ^ <代码>,并且在一个指示行开始的正则表达式中。例如,在表达式的开头使用它

比较:

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')
与:

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

将正则表达式与测试数据进行比较,有几个问题:

  • 指数的加号/减号不在正则表达式中
  • 在字符串中间的<代码> ^ 不是转义
  • 10^…
    可能不在数据中,但它在正则表达式中
  • 第一个
    可能不在数据中,但它在正则表达式中
  • 如果缺少符号时希望
    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'>
以下是一些解释:

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)

a[2]
将包含
'x10^-31'
,因此我跳过它,肯定有更好的解决方案。

通常正则表达式本身不会引发异常。你确定要给它一个字符串吗?是的,我想是的,可能是分组导致了问题,但我不确定嗨,在更改后,只有re.match(p2b,'5.2x10^31')。groups()不会引发异常,但其他情况仍会引发异常。是的。。。但是你的表达式还有其他各种各样的问题……嘿,你的代码很棒,但只有一个问题。0:应为(无,无,无)而不是(无,'0',无)
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')