前言

又是按往常一样刷leetcode,需要了​​65. 有效数字​​了,一想字符串匹配,就想到了永远的神——正则匹配,但是在匹配过程中需要了很多问题,将代码和问题记录以下。

基础知识:​​Python正则表达式​

代码

class Solution:
def isNumber(self, s: str) -> bool:
# 整数
integer = re.search(r'^[+-]?[\d]+', s)
if integer and integer.group() == s:
return True
# 小数
decimal = re.search(r'^[+-]?(([\d]+\.[\d]+)|([\d]+\.)|(\.[\d]+))', s)
if decimal and decimal.group() == s:
return True
# 科学计数法
science = re.search(r'^(([+-]?[\d]+)|[+-]?(([\d]+\.[\d]+)|([\d]+\.)|(\.[\d]+)))[eE][+-]?[\d]+', s)
if science and science.group() == s:
return True
return False

问题


  • 使用哪种匹配函数?
    此处推荐使用search,因为在确定只有一个内容是时,使用search方法可以提高效率。虽然默认的group()或group(0)也表示珍整个匹配。
  • 如何保证某些内容要么不出现要么只出现一次?
    很自然的想到了​​?​​,但是没想到​​[]​​中表示出现的内容。
  • 选择表达式(​​|​​)的使用?
    它最大的特点是从左到右匹配,一旦匹配成功就不会继续下去。因此我们需要考虑可选正则表达式的顺序,同时我们还需要考虑将分组的正则表达式使用​​()​​括起来,要不然范围就是整个表达式。

后记

对于正则表达式其实就是要多写多思考,要不然作为一个新手写一中午就为了有效数字,实属尴尬。溜了溜了,去做实验吧!