跟风学正则の笔记 测试工具
正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。
From LiaoXueFeng
在正则表达式中,如果直接给出字符,就是精确匹配。
用\d
可以匹配一个数字,\w
可以匹配一个字母或数字,所以:
'00\d'
可以匹配'007'
,但无法匹配'00A'
;而.
可以匹配任意字符,所以:
'py.'
可以匹配'pyc'
、'pyo'
、'py!'
要匹配变长的字符,在正则表达式中,
*
表示任意个字符(包括0个)+
表示至少一个字符?
表示0个或1个字符{n}
表示n个字符,用{n,m}
表示n-m个字符:A|B
可以匹配A或B,所以(P|p)ython
可以匹配'Python'
或者'python'
。
^
表示行的开头,^\d
表示必须以数字开头。
$
表示行的结束,\d$
表示必须以数字结束。
如果你想查找元字符本身的话,比如你查找.,或者,就出现了问题:你没办法指定它们,因为它们会被解释成别的意思。这时你就得使用\来取消这些字符的特殊意义。因此,你应该使用.和\。当然,要查找\本身,你也得用\.
例如:deerchao\.net
匹配deerchao.net,C:\\Windows
匹配C:\Windows。
import re# 从头找,找到了返回对象,找不到返回nonere.match(p,text)# 不是从第一个字符开始找obj = re.search(p,text)obj.start(),obj.end(),obj.group()# 找到多个对象re.findall(p,text)# 找到后把字符串分隔开re.split(p,text)# p替换成sre.sub(p,s,text)^ 字符串开头\b 单词开头\末尾\w 数字字母\S 不是空格+ == {1,}? 非贪婪模式
import re# emailpatten = 'bill.gates@microsoft.com'r = r'^(\w*)\.?(\w*)@(\w+).(\w+)'print(re.match(r,patten).groups())r1 = r'(<\w+\s\w+>)\s*(\w*)\.?(\w*)@(\w+).(\w+)'patten1 = '<Tom Paris> tom@voyager.org'print(re.match(r1,patten).groups())# 别人的re_email = re.match(r'^(\w+\.\w+|\w+)(\@\w+\.com)$','bill.a@microsoft.com')print(re_email.groups())
[^ \f\n\r\t\v]
。 |
char | description |
---|---|
* | 匹配前面的子表达式零次或多次。例如,zo 能匹配 “z” 以及 “zoo”。 等价于{0,}。 |
+ | 匹配前面的子表达式一次或多次。例如,’zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。 |
? | 匹配前面的子表达式零次或一次。例如,”do(es)?” 可以匹配 “do” 或 “does” 中的”do” 。? 等价于 {0,1}。 |
{n} | n 是一个非负整数。匹配确定的 n 次。例如,’o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。 |
{n,} | n 是一个非负整数。至少匹配n 次。例如,’o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。’o{1,}’ 等价于 ‘o+’。’o{0,}’ 则等价于 ‘o*’。 |
{n,m} | m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,”o{1,3}” 将匹配 “fooooood” 中的前三个 o。’o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。 |
\d{3}\s+\d{3,8}
\d{3}
表示匹配3个数字,例如'010'
;\s
可以匹配一个空格(也包括Tab等空白符),所以\s+
表示至少有一个空格,例如匹配' '
,' '
等;\d{3,8}
表示3-8个数字,例如'1234567'
。\(?0\d{2}[) -]?\d{8}。
“(”和“)”也是元字符,后面的分组节里会提到,所以在这里需要使用转义。
这个表达式可以匹配几种格式的电话号码,像(010)88886666,或022-22334455,或02912345678等。我们对它进行一些分析吧:首先是一个转义字符(,它能出现0次或1次(?),然后是一个0,后面跟着2个数字(\d{2}),然后是)或-或空格中的一个,它出现1次或不出现(?),最后是8个数字(\d{8})。
正则表达式 | 描述 | ||
---|---|---|---|
/\b([a-z]+) \1\b/gi | 一个单词连续出现的位置。 | ||
/(\w+):\/\/([^/:]+)(:\d)?([^# ])/ | 将一个URL解析为协议、域、端口及相对路径。 | ||
/^(?:Chapter\ | Section) [1-9][0-9]{0,1}$/ | 定位章节的位置。 | |
/[-a-z]/ | A至z共26个字母再加一个-号。 | ||
/ter\b/ | 可匹配chapter,而不能匹配terminal。 | ||
/\Bapt/ | 可匹配chapter,而不能匹配aptitude。 | ||
/Windows(?=95 \ | 98 \ | NT )/ | 可匹配Windows95或Windows98或WindowsNT,当找到一个匹配后,从Windows后面开始进行下一次的检索匹配。 |
/^\s*$/ | 匹配空行。 | ||
/\d{2}-\d{5}/ | 验证由两位数字、一个连字符再加 5 位数字组成的 ID 号。 | ||
/<\s(\S+)(\s[^>])?>[\s\S]<\s\/\1\s*>/ | 匹配 HTML 标记。 |
import re# emailpatten = 'bill.gates@microsoft.com'r = r'^(\w*)\.?(\w*)@(\w+).(\w+)'print(re.match(r,patten).groups())r1 = r'(<\w+\s\w+>)\s*(\w*)\.?(\w*)@(\w+).(\w+)'patten1 = '<Tom Paris> tom@voyager.org'print(re.match(r1,patten).groups())# 别人的re_email = re.match(r'^(\w+\.\w+|\w+)(\@\w+\.com)$','bill.a@microsoft.com')print(re_email.groups())