正则基础知识(字符组和量词)

本文介绍了正则表达式的字符组和量词等基础知识,包括如何使用字符组匹配特定范围内的字符,以及如何通过量词指定重复次数。还介绍了如何提取数据及正则表达式中的特殊字符。
[size=medium]

[b]一、字符组[/b]

1. [0123456789]匹配0-9这些数字,也可以用[0-9]来表示,这种表示方法的原理实际上是利用了字符对应的ascII码,0-9对应48-57,当然也可以[A-Z][a-z]来表示字母,其中A-Z对应65-90,a-z对应97-122,但是[0-z]这种表示方法最好不要用,因为很多符号之类的字符,比如";","<"等等之类的也在[0-z]的范围内。
例如:re.search("^[0-z]$", ":") != None # => True


2. "^", "$" 分别匹配字符的起始位置和结束位置
例如: re.search("^[0-9]", "2a") != None # => True
re.search("[0-9]$", "a2") != None # => True
re.search("[0-9]$", "2a") != None # => False
re.search("^[0-9]$", "23") != None # => False (起始位置和结束位置都匹配的话,只适用于整个字符串就是一个数字符号的情况下)
re.search("^[0-9]$", "2") != None # => True

3. 元字符是指 “-”, “[”, “]”, “^”, “$”等等,如果要取消元字符的特殊含义,就需要转义,就是在元字符前加上“\”,其中“-”紧接着“[”也可以表示在字符组内部使用“-”
例如:re.search("^[-09]", "3") != None # =>False
re.search("^[-09]", "-") != None # =>True
re.search("^[0\\-9]", "-") != None # =>True

4. 原生字符串的使用
Python提供了原生字符串,形式为r"string",例如:r"^[0\-9]$" == "^[0\\-9]$",在Python里面尽量多用原生字符串。

5. 排除型字符组
书写格式为:[^],在“[”后面紧跟一个“^”,表示在当前位置,匹配一个没有列出的字符,例如:
re.search(r"^[^0-9][0-9]$", "A8") != None # =>True
re.search(r"^[^0-9][0-9]$", "8") != None # =>False (排除型字符组必须要匹配一个字符)
另外,在排除型字符组中,紧跟在“^”之后的“-”不是元字符,例如:
re.search(r"^[^-09]$", "-") != None # => False

6. 字符组简记法
\d 表示[0-9] ,d代表digit
\w 表示[0-9a-zA-Z_],看清楚,后面还有个"_", w代表word
\s 表示[ \t\r\n\v\f], s代表space

\D是\d的排除型字符组
\W是\w的排除型字符组
\S是\s的排除型字符组

[\s\S]这种用法表示任意字符

[b]二、量词[/b]

1.一般形式{n},例如\d{6}表示匹配6个数字
{m,n},例如\d{4,6}表示4到6个数字,记住逗号前后不要有空格
{m,],表示至少有m个
{0,n}, 表示之多有n个(在某些语言中也可是{,n})

2.常用量词
* 等价于{0,}
+ 等价于{1,}
? 等价于{0,1}
例如:re.search(r"^travell?er$", "traveler") != None # =>True
re.search(r"^travell?er$", "traveller") != None # =>True

re.search(r"^<[^>]+>$", "<body>") != None # =>True
re.search(r"^<[^>]+>$", "</table>") != None # =>True
re.search(r"^<[^>]+>$", "<>") != None # =>False

re.search(r"^\"[^\"]*\"$", "\"some\"") != None # =>True
re.search(r"^\"[^\"]*\"$", "\"\"") != None # =>True

[color=red]注意: 如果查找‘customerId: ccheaaweb|3’中的ccheaaweb的话,可以这样匹配
re.search(r"customerId: (\w+)\|").group(1),记得要将+写在\w后面而不是括号后面[/color]

3.数据提取
re.search()如果匹配成功,返回一个MatchObject 对象,可以调用MatchObject.group(0)来获取表达式的结果
例如:
print re.search(r"\d{6}", "ad123456bc").group(0) = > 123456
另外一种提取数据的方法是re.findall(pattern, string)
例如:
print re.findall(r"\d{6}", "zipcode1:201203, zipcode2:100859")
= > ['201203', '100859']

4.点号
一般都认为"."可以匹配任意字符,但是有一个字符不能由点号匹配,那就是换行符\n

5.匹配优先量词(贪婪量词)和忽略优先量词(惰性量词)
匹配优先量词,在拿不准是否需要匹配的时候,优先尝试匹配,以被将来回溯。如之前的"*","+","?",{m,n},{m,},{,n} 就是匹配优先。
忽略优先量词,如果不确定是否要匹配,会选择不匹配的状态,在匹配优先量词后后加上"?"就是忽略优先。

[/size]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值