正则表达式(一)
正则表达式的元字符有. ^ $ * + ? { [ ] | ( )
.表示任意字符
$ 匹配行结束符。例如正则表达式weasel$ 能够匹配字符串"He's a weasel"的末尾,但是不能匹配字符串"They are a bunch of weasels."
在MULTILINE模式下,"$"也匹配换行之前
[] 用来匹配一个指定的字符类别,所谓的字符类别就是你想匹配的一个字符集,对于字符集中的字符可以理解成或的关系。 [adgk]
( ) (red|blue|green) 查找任何指定的选项。
^ 在[]的首个字符, 表示取非,。[^5]表示除了5之外的其他字符;
如果放在字符串的开头,则表示匹配字符串的开始,如“^ab”表示以ab开头的字符串。
如果^不在字符串的开头,则表示它本身。
具有重复功能的元字符(匹配数量):
* 对于前一个字符重复0到无穷次
+ 对于前一个字符重复1到无穷次
?对于前一个字符重复0到1次
{m,n} 对于前一个字符重复次数在为m到n次,试匹配尽可能多的copy(优先匹配n)其中,{0,} = *,{1,} = , {0,1} = ?
{m,n}? 用来表示前面正则表达式的m到n次copy,尝试匹配尽可能少的copy
{m} 对于前一个字符重复m次
\d 匹配任何十进制数;它相当于类 [0-9]。
\D 匹配任何非数字字符;它相当于类 [^0-9]。
\s 匹配任何空白字符;它相当于类 [ fv]。
\S 匹配任何非空白字符;它相当于类 [^ fv]。
\w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。
\W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]。
http://www.w3school.com.cn/jsref/jsref_regexp_onemore.asp
Note:
写法: 期望的字符+数量 ,
. 任意字符都可以
\s 这个地方要空白字符
\s+ 这个地方要 1-无穷个空白字符
.{0,10}这个地方要匹配0-10个字符
对于字符串本身出现元字符的字符, 用\ 来表示本字符意思。 如匹配这个值:[main] , 在正则搜索里面要写成 \[main\]
\[.{40}\]\s+Method.{0,100}groups.{0,12}config.{0,2}\n replace 则把相应行删除掉, 清理日志方便查看
\[.{40}\]\s+Checking.{0,75}groups.{0,12}config.{0,2}\n
\[2015.{40,100}\]\s+Waiting\s+for\s+(Input|element)\s+(xpath=|id=).{0,100}\n
下面具体python中, 结合正则表达式, RE模块的使用:
# coding=gb2312 ''' Created on 2014-06-4 @author: jennifer.huang ''' import re print"****re.search()**search和match方法是匹配到就返回,而不是去匹配所有, 并且match只匹配字符串的开始***" m=re.search("^ab+", "asdfabbbb") # ^表示开头 print 1, m m=re.search("ab+", "asdfabbbb") print 2, m print 3, m.group() m=re.search("[^abc]","abcd") # ^表示取非 print 4, m.group(); m=re.match("ab+", "asdfabbbb") #区别于search print 5, m m=re.match("ab+", "abbbb") print 6, m.group() m=re.search("^a\w+","abcdfa\na1b2c3",re.MULTILINE) #匹配到就返回,区别于下面的findall print 7, m.group() m=re.search("foo.$","foo1\nfoo2\n",re.MULTILINE) print 8, m.group() m=re.findall("^a\w+","abcdfa\na1b2c3",re.MULTILINE) #返回 list print 9, m m=re.findall("foo.$","foo1\nfoo2\n",re.MULTILINE) # $匹配字符串的结尾或者字符串结尾的换行之前(在MULTILINE模式下) print 10, m m=re.findall("foo.$","foo1\nfoo2\n") # $匹配字符串的结尾 print 11, m print 12, re.findall("a{2,4}","aaaaaaaa") #表示前面正则表达式的m到n次copy,尝试匹配尽可能多的copy print 13, re.findall("a{2,4}?","aaaaaaaa") #表示前面正则表达式的m到n次copy,尝试匹配尽可能少的copy print 14, re.match(".","\n") #元字符“.”在默认模式下,匹配除换行符外的所有字符 print 15, re.match(".","\n",re.DOTALL).group() #在DOTALL模式下,匹配所有字符,包括换行符 m=re.match("(\w+) (\w+)","abcd efgh, chaj") print 16, m.group() # 匹配全部 print 17, m.group(1) # 第一个括号的子组. print 18, m.group(2) print 19, m.group(1,2) # 多个参数返回一个元组 m=re.match("(?P<first_name>\w+) (?P<last_name>\w+)","Jennifer Huang") print 20, m.group("first_name") #使用group获取含有name的子组 print 21, m.group("last_name") m=re.match("\w+ \w+","abcd efgh, chaj") #括号去掉后的区别 print 22, m.group() #print m.group(1,2) #IndexError: no such group,与去掉()后, 19区别 m=re.match("(\d+)\.(\d+)","23.123") print 23, m.groups() m=re.match("(\w+) (\w+)","hello world") print 24, m.groupdict() #groupdict()对没有name的子组不起作用 m=re.match("(?P<first>\w+) (?P<second>\w+)","hello world") print 25, m.groupdict() print 26, re.split("\W+","words,words,works",1) print 27, re.split("[a-z]","OA3b9z",re.IGNORECASE) print 28, re.sub("\d","RE","abc1def2hijk") print 29, re.subn("\d","RE","abc1def2hijk")
附:
执行结果如下: