正则表达式简记
2015-03-11
在线测试
- http://www.regexr.com/
- http://www.pyregex.com/
- https://www.debuggex.com/
匹配
- 正则表达式的每个库的实现都可能不同.
- 字符本身是匹配存文本
.
匹配除换行符外的任意字符\
对正则表达式中有语法含义的字符进行转义, 转义需要注意, 如果后面跟的字符没有语法含义, 这正则表达式的语法检查器会报错.[]
表示字符集, 匹配此字符集内任意字符[-]
字符区间, 比如数字和字母的区间, 例:[a-f]
,[0-9]
, 实质上是ASII顺序的区间, 使用时应该注意,[A-Za-z0-9]
也是可以的.-
有语法含义,但是只有[]
里面才有, 在其他场合是普通字符.[^]
取非匹配, 含有这个字符集里面的字符的话, 就不匹配-
匹配空白符:
[\b]
回退符\r
回车符\f
换页符\t
制表符\n
换行符\v
垂直制表符
-
特殊匹配:
\d
匹配一个数字字符, 等价于[0-9]
\D
匹配一个非数字字符, 等价于[^0-9]
\w
等价于[a-zA-Z0-9]
\W
等价于[^a-zA-Z0-9]
\s
任一空百符, 等价于[\f\n\r\t\v]
\S
等价于[^\f\n\r\t\v]
^
匹配行(字符串)开始$
匹配行(字符串)结束^&
表示空行^.*&
表示全文
-
单词边界:
\b
单词边界, 用\b
围绕意味着需要该表达式是一个单词.\B
不是单词表姐, 比如\B-\B
表示一个前后都不是单词边界的连字符
-
后缀:
+
匹配重复出现的字符, 如[0-9]+, 匹配一个或多个数字; 这意味着要用\+
匹配”+”本身.*
匹配重复出现的字符, 0或多个?
要么出现, 要么不出现{}
指定重复次数的匹配, 比如{6}
表示重复6次{a,b}
指定指定重复次数的区间, 闭区间[a,b]{a,}
指定至少重复a次$
表示匹配后的字符串不应该有其他字符, 即, 匹配是发生在字符串最后的
- 懒惰型后缀表示尽快符合下一个匹配条件, 而不无限制地往后推
-
懒惰型后缀:
*?
对应*
+?
对应+
{n,}?
对应{n,}
-
前缀:
^
表示匹配检查从字符串开头开始(?m)
在分行匹配的正则表达式实现中, 要求表达式的匹配中首行开始, 否则不匹配
()
字表达式, 会被当做独立元素|
或表达式, 比如(19|20)匹配19或20\1
回溯引用用, 表示引用整个表达式的第一个子表达式, 这子表达式匹配了什么, 这里也得匹配什么, 否则整个表达式不匹配
替换
- 替换操作中, 通常用一个表达式搜索, 用另一个表达式转换, 此时可用
$n
引用搜索表达式中的第n个子表达式, 据此保留在搜索表达式中被匹配的字符 -
提换中, 进行大小写转换的元字符
\E
结束转换\l
把下一个字符转换为小写\L
把\L
到\E
之间的字符全部转换为小写\u
转换为大写\U
把\U
到\E
之间的字符全部转换为大写
?=
向前查找, 用它修饰子表达式, 表示这个子表达式能匹配上就好了, 不作为结果返回?<=
向后查找, 比如(?<=\$)[0-9]+
匹配”$”后面的实数(价格)-
向前向后查找的一个综合例子:
(?<=<[tT][iI][tT][lL][eE]>).*(?=</[tT][iI][tT][lL][eE]>)
匹配标签中的文本.
-
取非前后查找:
?!
负向前查找?<!
负向后超早- 比如
?<!$)\d+\b
会匹配数字, 而不会匹配$开头的价格
-
条件表达式:
?(backer-ference)true-regex|fulse-regex)
-
先后查找条件:
(?(?=-)-\d{4})
如果有’-‘, 则要求’-‘后面有4个数字
-
零度断言:
^
匹配行开始的位置$
匹配行结束的位置\A
匹配必须出现在字符串的开头\Z
匹配必须出现在字符串的结尾或字符串结尾处的换行符\n
之前\z
匹配必须出现在字符串的结尾\G
匹配必须出现在上一个匹配结束的地方b
匹配单词的开始或结束位置\B
匹配不是单词的开始或结束位置
-
常见正则表达式例子:
- IP地址:
((\d{1,2})|(|\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2}|(|\d{2})|(2[0-4]\d)|(25[0-5]))
- URL:
https?://[-\w.]+(:\d+)?(/([\w/-.]*)?)?
- 完整的URL:
https?://(\w*:\w*@)?[-\w.]+(:\d+)?(/([\w/-.]*(\?\S+)?)?)?
- 邮件地址:
(\w+\.)*\w+@(\w+\.)+[A-Za-z]+
- IP地址:
编程
Python
具名的子表达式
import re
test_pt = r'\d+(?P<inc>[A-Za-z]+)\d+'
example_str = '1234Google4567'
ret = re.search(test_pt,example_str)
if ret:
print ret.group('inc')
Reference:
- [1]: 伯乐在线 - programmer_lin. 55分钟学会正则表达式