举例:
1.匹配hello world
key = r"<h1>hello world<h1>" #源文本
p1 = r"<h1>.+<h1>" #正则表达式
pattern1 = re.compile(p1)
print pattern1.findall(key) #findall返回的是所有符合要求的元素列表,如果只有一个元素时,它还是返回列表。
2.匹配@与.之间的ygomi
key='aaaapiaoyu.qiu@ygomi.com.cn'
>>> p1=r"@.+."
>>> pattern1=re.compile(p1
>>> pattern1.findall(key)
['@ygomi.com.'] #结果匹配到了更多的内容
>>>
>>> p1=r"@.+?." #增加?
>>> pattern1=re.compile(p1)
>>> pattern1.findall(key)
['@ygomi.'] #匹配成功
原因是正则表达式默认是“贪婪”的,“+”代表是字符重复一次或多次,在我们没有细说这个多次到底是多少次时,它会尽可能“贪婪”地多给我们匹配字符,即匹配到最后一个“.”。怎么解决这种问题呢?只要在“+”后面加一个“?”就可以将贪婪的“+”改成了懒惰的“+”。
3.准确控制控制重复次数:{a,b} 其中,a<=匹配次数<=b
举栗,我们有sas,saas,saaas,我们想要sas和saas
key = r"saas and sas and saaas"
p1 = r"sa{1,2}s"
pattern1 = re.compile(p1)
print pattern1.findall(key)
输出:['saas', 'sas']
如果你省略掉{1,2}中的2,那么就代表至少匹配一次,那么就等价于?。如果你省略掉{1,2}中的1,那么就代表至多匹配2次。
正则表达式里的元字符及其作用:
元字符
|
说明
|
.
|
代表任意字符,用于匹配除换行符(
)之外的所有字符。
|
|
|
逻辑或操作符,例如:A|B用于匹配A或B
|
[ ]
|
匹配内部的任一字符或子表达式
[0-9] 0123456789任意之一
[a-z] 小写字母任意之一
[A-Z] 大写字母任意之一
|
[^]
|
'[]'用于标示一组字符,如果^是第一个字符,则标示的是一个补集。
比如[0-9]表示所有的数字,[^0-9]表示除了数字外的字符。
|
-
|
定义一个区间
|
对下一字符取非(通常是普通变特殊,特殊变普通)
|
|
*
|
匹配前面的字符或者子表达式0次或多次(贪婪模式,即尽可能多的匹配)
|
*?
|
惰性匹配上一个(非贪婪模式)
|
+
|
匹配前一个字符或子表达式一次或多次(贪婪模式)
|
+?
|
惰性匹配上一个(非贪婪模式)
|
?
|
匹配前一个字符或子表达式0次或1次重复(贪婪模式)
|
{n}
|
匹配前一个字符或子表达式
|
{m,n}
|
匹配前一个字符或子表达式至少m次至多n次
|
{n,}
|
匹配前一个字符或者子表达式至少n次
|
{n,}?
|
前一个的惰性匹配
|
^
|
匹配字符串的开头
|
A
|
匹配字符串开头
|
$
|
匹配字符串的末尾(末尾如果有换行符
,就匹配
前面的那个字符)
|
[]
|
退格字符
|
c
|
匹配一个控制字符
|
d
|
匹配任意数字,等同于[0-9]
|
D
|
匹配数字以外的字符,等同于[^0-9]匹配非数字
|
|
匹配制表符
|
w
|
匹配任意数字字母下划线,,,等同于[a-z0-9A-Z_]匹配大小写字母、数字和下划线
|
W
|
不匹配数字字母下划线,,,等同于[^a-z0-9A-Z_]等同于上一条取非
|