如何修复正则表达式

时间:2017-01-25 22:17:25

标签: python

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

似乎我的正则表达式引发了异常,但我不确定为什么。有人可以帮我解决吗?提前谢谢。

2 个答案:

答案 0 :(得分:0)

例外情况是因为re.match正在返回None。然后,您无法访问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'>

答案 1 :(得分:0)

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

  • 指数的加/减不在正则表达式
  • 字符串中间的^未转义
  • 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',所以我跳过它,肯定有更好的解决方案。