python 正则表达式 r"(?<=str1).+?(?=str2)"
正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。
(?<=str1)
表示在此后的正则中,前面要匹配str1
(?=str2)
表示在此前的正则中,后面要匹配str2
这两个表达式表示的是条件,不是实际匹配正则的一部分
‘.’用于匹配除换行符(\n)之外的所有字符。
‘*’用于将前面的模式匹配0次或多次(贪婪模式,即尽可能多的匹配)
‘+’用于将前面的模式匹配1次或多次(贪婪模式)
‘?’用于将前面的模式匹配0次或1次(贪婪模式)
‘*?,+?,??’即上面三种特殊字符的非贪婪模式(尽可能少的匹配)。
‘^’用于匹配字符串的开始,即行首。
‘$’用于匹配字符串的末尾(末尾如果有换行符\n,就匹配\n前面的那个字符),即行尾。
‘{m,n}’用于将前面的模式匹配m次到n次(贪婪模式),即最小匹配m次,最大匹配n次。
‘{m,n}?’即上面‘{m,n}’的非贪婪版本。
‘\\’:'\'是转义字符,在特殊字符前面加上\,特殊字符就失去了其所代表的含义,比如\+就仅仅代表加号+本身。
‘[]’用于标示一组字符,如果^是第一个字符,则标示的是一个补集。比如[0-9]表示所有的数字,[^0-9]表示除了数字外的字符。
‘|’比如A|B用于匹配A或B。
‘(...)’用于匹配括号中的模式,可以在字符串中检索或匹配我们所需要的内容。
p1 = r"(?<={0}).+?(?= \\n)".format('Undistort Flag: ')
pattern1 = re.compile(p1) #编译这段正则表达式
matcher1 = re.search(pattern1, output) #在源文本中搜索符合正则表达式的部分
rtv_lag = matcher1.group(0)
print '~~~~~~~~`',rtv_lag
return rtv_lag
python 正则表达式的学习:
初级:
key = r"<h1>hello world<h1>"#源文本
p1 = r"<h1>.+<h1>"#我们写的正则表达式,下面会将为什么
pattern1 = re.compile(p1)
print pattern1.findall(key)#发没发现,我怎么写成findall了?咋变了呢?
findall返回的是所有符合要求的元素列表,包括仅有一个元素时,它还是给你返回的列表。
正则表达式 |
代表的匹配字符 |
[0-9] |
0123456789任意之一 |
[a-z] |
小写字母任意之一 |
[A-Z] |
大写字母任意之一 |
\d |
等同于[0-9] |
\D |
等同于[^0-9]匹配非数字 |
\w |
等同于[a-z0-9A-Z_]匹配大小写字母、数字和下划线 |
\W |
等同于[^a-z0-9A-Z_]等同于上一条取非 |
一些匹配不准确的例子
想要匹配@与.之间的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.']
原因是正则表达式默认是“贪婪”的,“+”代表是字符重复一次或多次。但是我们没有细说这个多次到底是多少次。所以它会尽可能“贪婪”地多给我们匹配字符,在这个例子里也就是匹配到最后一个“.”。
我们怎么解决这种问题呢?只要在“+”后面加一个“?”就好了。加了一个“?”我们就将贪婪的“+”改成了懒惰的“+”。这对于[abc]+,\w*之类的同样适用。
准确控制控制重复次数:{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次。
正则表达式里的元字符及其作用:
元字符 |
说明 |
. |
代表任意字符 |
| |
逻辑或操作符 |
[ ] |
匹配内部的任一字符或子表达式 |
[^] |
对字符集和取非 |
- |
定义一个区间 |
\ |
对下一字符取非(通常是普通变特殊,特殊变普通) |
* |
匹配前面的字符或者子表达式0次或多次 |
*? |
惰性匹配上一个 |
+ |
匹配前一个字符或子表达式一次或多次 |
+? |
惰性匹配上一个 |
? |
匹配前一个字符或子表达式0次或1次重复 |
{n} |
匹配前一个字符或子表达式 |
{m,n} |
匹配前一个字符或子表达式至少m次至多n次 |
{n,} |
匹配前一个字符或者子表达式至少n次 |
{n,}? |
前一个的惰性匹配 |
^ |
匹配字符串的开头 |
\A |
匹配字符串开头 |
$ |
匹配字符串结束 |
[\b] |
退格字符 |
\c |
匹配一个控制字符 |
\d |
匹配任意数字 |
\D |
匹配数字以外的字符 |
\t |
匹配制表符 |
\w |
匹配任意数字字母下划线 |
\W |
不匹配数字字母下划线 |