正则表达式

一、边界匹配
- '^' : 匹配开头如 '^\d' 必须以数字开头才能匹配到。"3siwu" - '$' : 匹配结尾如 '[a-z]$' 只能匹配到小写字母结尾的字符串。 "3423Az"
  • '\A' 只从字符开头匹配,re.search("\Aabc","Aabc") 是匹配不到的。同 ^

  • '\Z' 匹配字符结尾,同$

  • "\b" :不会消耗任何字符只匹配一个位置,常用于匹配单词边界 如 我想从字符串中"This is Regex"匹配单独的单词 "is" 正则就要写成 "\bis\b"

   \b 不会匹配is 两边的字符,但它会识别is 两边是否为单词的边界

  • "\B" 匹配不是单词开头或结束的位置
二、一般字符
  • '.' 点匹配除\n之外的任意一个字符,(python re模块中,若指定flag DOTALL,则匹配任意字符,包括换行)
  • '\': 转义字符,改变后一个字符代表的意思,如'\AA' 就是只能匹配大写A开头。同理只有这样才能匹配到斜杠 '\'
  • '[]': 中括号,表示匹配里面里面任意一个字符。如果[^abcd] 以^开头表示取反,匹配除了abcd以外的任意字符。[0-9a-zA-Z] 表示匹配0到9和a到z及A到Z
三、已被定义了的字符
- "\d": 匹配数字,'sjgk8jge' 使用 'd' 就可以匹配出里面的数字8。'\d' 范围为[0-9] - "\D" :匹配非数字,字母或者特殊字符都能匹配
  • "\w":匹配[A-Za-z0-9]
  • '\W' 匹配非[A-Za-z0-9]
四、放在字符后表示匹配数量
  • '*' 匹配*号前的字符0次或多次,re.findall("ab*","cabb3abcbbac") 结果为['abb', 'ab', 'a']
  • '+' 匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果['ab', 'abb']
  • '?' 匹配前一个字符1次或0次
  • '{m}' 匹配前一个字符m次
  • '{n,m}' 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果'abb', 'ab', 'abb']
五、逻辑分组
- '|' 匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 结果'ABC' - '(...)' 分组匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 结果 abcabca456c
六、好用的升级版分组匹配

"(exp)" 匹配exp,并捕获文本到自动命名的组里

"(?exp)" 匹配exp,并捕获文本到名称为name的组里

"(?:exp)" 匹配exp,不捕获匹配的文本,也不给此分组分配组号

以下为零宽断言

"(?=exp)" 匹配exp前面的位置

  如 "How are you doing" 正则"(?.+(?=ing))" 这里取ing前所有的字符,并定义了一个捕获分组名字为 "txt" 而"txt"这个组里的值为"How are you do";

"(?<=exp)" 匹配exp后面的位置

  如 "How are you doing" 正则"(?(?<=How).+)" 这里取"How"之后所有的字符,并定义了一个捕获分组名字为 "txt" 而"txt"这个组里的值为" are you doing";

"(?!exp)" 匹配后面跟的不是exp的位置

  如 "123abc" 正则 "\d{3}(?!\d)"匹配3位数字后非数字的结果

"(?<!exp)" 匹配前面不是exp的位置

  如 "abc123 " 正则 "(?<![0-9])123" 匹配"123"前面是非数字的结果也可写成"(?!<\d)123"

posted @ 2018-08-14 00:34  G1733  阅读(536)  评论(0编辑  收藏  举报