re

2018/09/21

python re

re中最常见的符号和字符

'.'     表示任何字符除了'\n'
'^'     表示以什么字符开头,eg:'^b' 以b开头
'$'     表示以什么字符结尾,eg:'b$' 以b结尾
'*'     匹配前面出现的正则表达式0次或者多次      eg: [A-Za-z0-9]*
'+'     匹配前面出现的正则表达式1次或者多次      eg: [a-z]+\.com
'.*'    配合使用表示匹配任意字符
'?'     匹配前面出现的re 0次或1次,是一种非贪婪匹配的模式(即从左边的字符串开始匹配的第一个)(总是尝试匹配尽可能少的字符)
'.*?'   配合用于非贪婪匹配模式
'()'    表示提取字符串的子串(即将括号内中的字符作为一个分组)
'(?P<name>)'    分组起别名   eg. re.match(r"<(?P<name1>\w*)><(?P<name2>\w*)>.*</(?P=name2)></(?P=name1)>", "<html><h1>www.itcast.cn</h1></html>")
'(?P=name)'     引用别名为name分组匹配到的字符串
'{}'    表示限定前面那个字符出现的次数,eg:'a{2}' 表示限定a出现两次,如果写成'a{2,}', 匹配前一个字符至少出现m次
'{2,5}' 表示出现最少两次最多5次
'|'     表示或的意思(匹配左右任意一个表达式),eg:'ab|abc' 表示匹配ab或者abc即可,优先匹配前面的那段字符
'[]'    表示中括号里面的字符只要满足任意一个就行,eg:'[0-9]','[^1]'
'[^...]'不匹配此字符串集中出现的任何字符    eg: [^abc]
'\s'    表示匹配空白字符, eg. ' ', '\n', '\t', '\r'     '\S'表示非空格
'\w'    等同于'[A-Za-z0-9_]' 同样'\W'表示不为小写w中的字符就匹配
'[\u4E00-\u9FA5]'   表示提取一个汉字
'\d'    表示匹配连续的数字, 即0-9
'\D'    匹配非数字, 即不是数字
'\b'    匹配单词边界(\B是\b的反义)        eg: \bThe\b 即两边不能有其它字符
'\nn'   匹配已保存的子组        eg: price:\16
'\num'  引用分组num匹配到的字符   根据分组的num号  eg. re.match(r"<(\w*)><(\w*)>.*</\2></\1>", "<html><h1>www.itcast.cn</h1></html>")
'\c'    逐一匹配特殊字符c(即,取消它的特殊含义,按字面匹配)     eg: \., \\, \*
正则表达式默认是贪婪匹配的(反向匹配,即从右边的字符串开始匹配的第一个)(贪婪匹配总是匹配前面尽可能多的字符)
修饰符	描述
re.I	使匹配对大小写不敏感
re.L	做本地化识别(locale-aware)匹配
re.M	多行匹配,影响 ^ 和 $
re.S	使 . 匹配包括换行在内的所有字符
re.U	根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X	该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。
  • (?=xx) 从左向右匹配, 匹配括号内的字符
  • (?!=xx) 和上面效果正好相反
  • (?<=xx) 从左向右匹配, 匹配非括号内的后面的字符, eg. re.search(‘(?<=-)\w+’, ‘spam-egg’).group(0) -> egg
  • (?<!xx) 和上面效果正好相反

常用re str

匹配邮箱(不通用)

rex = '\w[-\w.+]*@([A-Za-z0-9][A-Za-z0-9]+\.)+[A-Za-z]{2,14}'

匹配网址url的正则表达式

rex = '[a-zA-z]+://[^\s]*'

匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线)

rex = '^[a-zA-Z][a-zA-Z0-9_]{4,15}$'        # 评注:表单验证时很实用

匹配HTML标记的正则表达式:

rex = '<(\S*?)[^>]*>.*?</\1>|<.*? />'       # 评注:上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力