python_正则表达式

了解正则

  在实际的应用中,我们会经常得到用户的输入,在得到用户的输入之后,需要我们对输入进行判断时候合法,比如判断输入的手机号码,从形式上来看是正确的呢?

笨办法
phone = "15132154554"
if phone.startswith("1") and phone.isdigit() and len(phone) == 11:
    print("正在给你发送验证码")  # 验证通过
else:
    print("请输入正确的电话号码")   #验证失败

 

利用正则:
import re
phone = "15132154554"
# 匹配,满足正则表达式的内容
if re.findall(r"^1\d{10}$", phone):
    print("正在给你发送验证码")
else:
    print("请输入正确的电话号码")

那么看到这里大家就理解了把,正则就是通过匹配满足的条件,达到优化代码的方式。我们进入正题

 

. 通配符,匹配除 \n 外所有的字符
import re
st1 = "\nthis is pig \n do you know?"
ss1 = re.findall(".", st1)
print(ss1)
结果
['t', 'h', 'i', 's', ' ', 'i', 's', ' ', 'p', 'i', 'g', ' ', ' ', 'd', 'o', ' ', 'y', 'o', 'u', ' ', 'k', 'n', 'o', 'w', '?']

 

^ 匹配字符串开始的位置
import re
st2 = "this is pig \n do you know?"
ss2 = re.findall("^th", st2)
print(ss2)
ss2 = re.findall("^doyou", st2)
print(ss2)
结果
['th']
[]

 

   $ 匹配字符串结束位置

 

import re
st3 = "this is pig \n do you know"
ss3 = re.findall("ow$", st3)
print(ss3)
ss3 = re.findall("pig$", st3)
print(ss3)

 

 结果

['ow']
[]

 

* 匹配前面的正则0次到无穷次

 

import re
st4 = "this is pig \n do you know?"
ss4 = re.findall("i*", st4)
print(ss4)
ss4 = re.findall("is*", st4)
* 匹配复数 不存在空字符
print(ss4)

   结果

 

['', '', 'i', '', '', 'i', '', '', '', 'i', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
['is', 'is', 'i']

 

 

+ 匹配前面的正则1次到无穷次
import re
st5 = "this is pig \n do you know?"
ss5 = re.findall("i+", st5)
print(ss5)
ss5 = re.findall("is+", st5)
print(ss5)

   结果

['i', 'i', 'i']
['is', 'is']

 

 

? 匹配前面的正则0次到1次
import re
st6 = "this is pig \n do you know?"
ss6 = re.findall("i?", st6)
print(ss6)
ss6 = re.findall("is?", st6)
print(ss6)

   结果

 

['', '', 'i', '', '', 'i', '', '', '', 'i', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
['is', 'is', 'i']

 

 

{}   匹配次数
{N,} 匹配前面的正则 N到无穷次
{,M} 匹配前面的正则 0到M次
{N,M} 匹配前面的正则 N到M次
注: N和M皆为正整数
import re
st7 = "aa^&*aaa^&*aaaa^&*aaaaa^&*aaaaaa"
s1 = re.findall(r"a{1,}", st7)
print(s1)
s2 = re.findall(r"a{,3}", st7)
print(s2)
s3 = re.findall(r"a{1,4}", st7)
print(s3)

   结果

 

['aa', 'aaa', 'aaaa', 'aaaaa', 'aaaaaa']
['aa', '', '', '', 'aaa', '', '', '', 'aaa', 'a', '', '', '', 'aaa', 'aa', '', '', '', 'aaa', 'aaa', '']
['aa', 'aaa', 'aaaa', 'aaaa', 'a', 'aaaa', 'aa']

 

 

\   正则转义符
\d 匹配数字
\s 匹配空白符号
\w 匹配字母、数字、下划线、汉字
\b 单词边界
import re
st8 = "this is 12 dog 3 \n45  \t6 你_好*^acfun"
a1 = re.findall(r"\d", st8)
print(a1)
a2 = re.findall(r"\s", st8)
print(a2)
a3 = re.findall(r"\w", st8)
print(a3)
a4 = re.findall(r"\bac", st8)
print(a4)

   结果


['1', '2', '3', '4', '5', '6']
[' ', ' ', ' ', ' ', ' ', '\n', ' ', ' ', '\t', ' ']
['t', 'h', 'i', 's', 'i', 's', '1', '2', 'd', 'o', 'g', '3', '4', '5', '6', '', '_', '', 'a', 'c', 'f', 'u', 'n']
['ac']

 

\   正则转义符
\D 匹配数字以外的字符
\S 匹配空白符号以外的字符
\W 匹配字母、数字、下划线、汉字以外的字符
\B 非单词边界
import re
st1 = "this is 12 dog 3 \n45  \t6 你_好*^acfun"
s1 = re.findall(r"\D", st1)
print(s1)
s2 = re.findall(r"\S", st1)
print(s2)
s3 = re.findall(r"\W", st1)
print(s3)
s4 = re.findall(r"\Bcf", st1)
print(s4)

  结果

 

['t', 'h', 'i', 's', ' ', 'i', 's', ' ', ' ', 'd', 'o', 'g', ' ', ' ', '\n', ' ', ' ', '\t', ' ', '', '_', '', '*', '^', 'a', 'c', 'f', 'u', 'n']
['t', 'h', 'i', 's', 'i', 's', '1', '2', 'd', 'o', 'g', '3', '4', '5', '6', '', '_', '', '*', '^', 'a', 'c', 'f', 'u', 'n']
[' ', ' ', ' ', ' ', ' ', '\n', ' ', ' ', '\t', ' ', '*', '^']
['cf']

 

 

[] 字符集合,匹配在这中间的所有字符
. % * + ? () {} 在中括号里面仅表示符号本身
^ 在中括号里面表示取反
st9 = "this is 12 dog 3 \n45  \t6 你_好*^acfun"
t1 = re.findall(r"[132]", st9)
print(t1)
t2 = re.findall(r"[^i]", st9)
print(t2)

   结果

 

['1', '2', '3']
['t', 'h', 's', ' ', 's', ' ', '1', '2', ' ', 'd', 'o', 'g', ' ', '3', ' ', '\n', '4', '5', ' ', ' ', '\t', '6', ' ', '', '_', '', '*', '^', 'a', 'c', 'f', 'u', 'n']

 

| 或
import re
st10 = "this is 12 dog 3 \n45  \t6 你_好*^acfun"
st10 = re.findall(r"1|333", st10)
print(st10)

   结果

['1']

 

() 分组匹配,只会返回括号中匹配的内容
import re
st11 = "this is 12 dog 3 \n45  \t6 你_好*^acfun"
w1 = re.findall(r"1(\d)", st11)
print(w1)
w2 = re.findall(r"t(\w)", st11)
print(w2)
w3 = re.findall(r" (.)", st11)
print(w3)

   结果

['2']
['h']
['i', '1', 'd', '3', ' ', '']

 

 

贪婪:寻找最长的匹配;会产生回溯
非贪婪:寻找最短的匹配
import re
st12 = "<table><tr><td>表格1</td</tr></table>这里是末尾"
s12 = re.findall(r"<.*>", st12)  # 贪婪
# 运行机制:匹配到第一个字符,回溯到最后向前找,找到拿全部,返回
print(s12) s22 = re.findall(r"<.*?>", st12) # 非贪婪 print(s22)

   结果

 

['<table><tr><td>表格1</td</tr></table>']
['<table>', '<tr>', '<td>', '</td</tr>', '</table>']

 

到这里,我们的元字符就整理完毕了,看到这里。距离我们的应用还很远,那么小编在这里再写个现实中的例子。

小编是测试, 再用Jmeter 正则表达式取json串的时候遇到的问题,见下:

 

{"status":0,"registerTenantId":"","statusText":"??????","developInfo":"","detailStatus":"","detailStatusText":"","detailErrors":[],"data":"{\"id\":150074004,\"entityId\":409}","entityName":"","copyPriceMap":""}

 

那么我要取出 json 中的id 值, 因为是json{str}, jmeter不支持python语法,所有书写如下:

"data".+":(\d+),

 

 

 

作者:含笑半步颠√

出处:https://www.cnblogs.com/lixy-88428977/

欢迎转载,但请在文章页面明显位置给出原文链接。
posted @ 2018-08-15 22:21  含笑半步颠√  阅读(970)  评论(1编辑  收藏  举报