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)
例外情况是因为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'
,所以我跳过它,肯定有更好的解决方案。