如何修复正则表达式[重复]

Posted

技术标签:

【中文标题】如何修复正则表达式[重复]【英文标题】:how to fix the regular expression [duplicate] 【发布时间】:2017-01-25 22:17:25 【问题描述】:
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')

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

【问题讨论】:

通常正则表达式本身不会引发异常。你确定你给它一个字符串吗? 是的,我想我做到了,可能是分组导致了问题,但我不确定 【参考方案1】:

一个例外是因为发生您的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'>

【讨论】:

您好,更改后,只有 re.match(p2b,'5.2x10^31').groups() 不会引发异常,但其余情况仍在引发异常。跨度> 是的……但是你的表情还有各种各样的问题……【参考方案2】:

比较正则表达式和测试数据,有几个问题:

指数的正/负不在正则表达式中 字符串中间的^ 没有转义 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 : 应该是 (None, None, None) 而不是 (None, '0', None)

以上是关于如何修复正则表达式[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何修复这个正则表达式?

如何在 C# 中修复正则表达式

使用正则表达式映射系列时如何修复 np.cumsum 函数

如何修复 jsx 结束标签上的 linting 错误:“未关闭的正则表达式”?

正则表达式.如何在正则表达式末尾添加可选字符[重复]

如何在正则表达式中包含变量[重复]