python 正则表达式 初级

举例:

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_]等同于上一条取非
 
原文地址:https://www.cnblogs.com/mianbaoshu/p/12068720.html