关于正则表达式的一些理解
最近在学习中文分词过程中遇到正则表达式,有一些难点记录一下,目前也只是看了些初级的知识,看到一个讲的比较简明易懂的的博客地址:
初级篇:https://www.cnblogs.com/chuxiuhong/p/5885073.html
中级篇:http://www.cnblogs.com/chuxiuhong/p/5907484.html
还有一个《正则表达式必知必会》的笔记:http://www.cnblogs.com/lmmjblogs/p/5908605.html
遇到的难以理解的地方
向前向后查找
r"(?<=A)XX(?=B)"
(?<=A)XX表示匹配字符的前面紧跟字符“A”,即匹配其前缀为“A”的“XX”字符;
AXX中的XX可以被匹配出来,aXX中的XX不能被匹配出来
XX(?=B)XX表示匹配字符的后面紧跟字符“B”,即匹配其后缀为“B”的“XX”字符;
XXB中的XX可以被匹配出来,XXb中的XX不能被匹配出来
一句话总结:有"<"符号的是前缀要求,没有是后缀要求。
标题表示匹配前缀为A且后缀为B的XX
嵌入条件
回溯嵌入条件
?(1):检查第一个回溯引用是否存在。
文本:123-456-7890
(123)456-7890
(123)-456-7890
(123-456-7890
1234567890
123 456 7890
正则表达式:(\()?\d{3}(?(1)\)|-)\d{3}-\d{4}
结果:123-456-7890 #匹配成功
(123)456-7890 #匹配成功
(123)-456-7890 #失败
(123-456-7890 #失败
1234567890 #失败
123 456 7890 #失败
个人理解:( \( )? \d{3} ( ?(1) \)|- ) \d{3}-\d{4}
转义表示括号 检查前面 是匹配“)” 匹配“3个数字-4个数字”
匹配0个或1个括号 匹配3个数字 是否匹配了“(” 否匹配“-”
前后查找条件
(?(前后查找表达式))
文本:11111
22222
33333-
44444-4444
正则表达式:\d{5}(?(?=-)-\d{4})
结果:11111 #成功
22222 #成功
33333- #失败
44444-4444 #成功
个人理解:\d{5} ( ?(?=-) -\d{4} )
匹配5个数字 后缀是否为“-” 是则匹配“-4个数字”