如何检查正则表达式是否完全匹配字符串,即字符串中没有额外字符?
我有两个问题:
1) 我有一个正则表达式 ([A-Z][a-z]{0,2})(\d*)
,我在用Python的 re.finditer()
来匹配合适的字符串。我的问题是,我想只匹配那些没有额外字符的字符串,否则我想抛出一个异常。
我想匹配的模式是:一个大写字母,后面跟着0到2个小写字母,再后面是0个或多个数字。
这个模式代表的是化学式,也就是一个元素后面跟着它出现的次数。我想把元素放到一个字典里,并记录它的出现次数,所以我需要把元素(大写字母后面跟着0到2个小写字母)和数字分开,但要记住它们是一起的。
例如:
C6H5Fe2I # this string should be matched successfully. Result: C6 H5 Fe2 I
H2TeO4 # this string should be matched successfully Result: H2 Te O4
H3PoooO5 # exception should be raised
C2tH6 # exception should be raised
2) 第二个问题是,如果输入字符串不正确,我应该抛出什么样的异常。
谢谢,Tomas
10 个回答
2
你是需要把每个部分单独提取出来处理,还是只是想检查输入是否有效?如果你只是想检查输入的有效性,可以试试这个:^([A-Z][a-z]{0,2}\d*)+$
。
3
一个大写字母,后面跟着0、1或2个小写字母,再后面跟着0个或多个数字。
好的。
/^([A-Z][a-z]{0,2}\d*)+$/
这里的区别在于额外的分组 (foo)+
在 ^$
里面,这样你就可以捕捉到模式 foo 出现N次。
没有全局标志?那你可能需要再次根据这个模式来分割正则表达式的结果。
5
这里有几种不同的方法可以使用:
比较长度
- 先找出原始字符串的长度。
- 然后把匹配到的字符串的长度加起来。
- 如果这两个数字不一样,那说明有一些字符没有被用到。
注意,如果你想避免重复解析字符串,可以把这个方法和你现有的代码结合起来,而不是单独作为一个步骤来做。
整个字符串的正则表达式
你可以检查这个正则表达式是否匹配整个字符串:
^([A-Z][a-z]{0,2}\d*)*$
分词
你可以用下面的正则表达式来对原始字符串进行分词:
[A-Z][^A-Z]*
然后检查每个词是否和你原来的正则表达式匹配。