re正则表达式
因为字符串方法有局限性,在模糊查找匹配的时候需要re,比如身份证号码,要分地区,年代一起综合查询、IP处理等
re正则就是完全面向字符串的和其他无关,是用C语言写的
元字符
. ^ & + ? {} [] | () \
re.findall('all','jflkjalkjalljkjfkdjalljie') 匹配结果是列表 这是完全匹配,模糊匹配则要用到元字符
点 .
是通配符,什么都可以代替除了换行符\n,一个点代表一个字符,不能代表多个
re.findall("a..x","fjaklsfjklsdfjalax")
尖角号^
是以什么开头的,必须在字符串的开头,用处就是判断开头的
$
是以什么结尾的,必须在字符串的结尾,re.findall("all$","fdsahfjall")
负责重复的元字符 * + ? [] {} ()
* 0到无穷次数 匹配 可以没有也能匹配 alex* ljfdkljafale 可以匹配
+ 1到无穷次数 匹配 至少有一个才能匹配 alex+ jfklajfale不能匹配
? 0-1次 alex? fljalkfjale 可以匹配
以上三种 属于贪婪匹配, 按后面最多的匹配
惰性匹配就在后面加个 ? 就按最少次数匹配了
{} 自定义次数 {0,10} 可以表示上述三种情况的任意一种 {6}匹配6次
字符集【】 是或的关系 里面只有三个字符是有特殊功能 - ^ \
[] 元素集合中的或者[xyz] x 或 y 或 z 都满足匹配条件 [a-z] a到z [a-z]* a-z字符出现0次到无穷 *是修饰前面的字符的。
[^a-z] 非的意思 除了a-z都满足,排除a-z
a=re.findall('\([^()]*\)','32+31*(12+(5+1*3))') #\( 代表括号 字符集[^()]*代表除了()后面可以任意多个字符。\) 代表右括号结尾
print(a)
这样可以匹配出最里面的括号内容['(5+1*3)']
\ 转义字符
有意义的变无意义,变普通符号 \. \( \) \* \$等
无意义的变特殊: \d 数字0-9任意数字 \d+ 数字 \D 就是非数字
\s 取空格空白字符\n\t等 \S 非空格 \w 字母数字下划线_ 但不包含特殊字符,比如@ \W非字母数字
以上的\参数pycharm里不冲突,所以可以直接用
\b $#空格特殊字符 re.findall('I\b','I am stu') 这个并不能找到I ,因为pycharm会对\b进行解释,所以re无法匹配。re.findall(r'I\b','I am stu') 要在前面加r这样就能给re模块原生的字符串,或者在前面加一个\
注意:pycharm 和 re 都会进行\的转义,需要注意! r(“”)这样就是传给re的是原生字符串
|管道符 或者的意思优先级比括号高
()括号,代表分组,()内的内容自动优先显示出来,(?:abc)去分组,会取整体匹配的字符串结果
search
findall是返回所有符合匹配的元素并返回列表
search是返回第一个符合的元素的详细信息,并返回一个对象,需要用group方法取到值
ka|ca ka或者ca 并不是 a或者c 有个组的概念,如果不确定可以加()
re.search('(?P<name>alex)',"alex33dong40").group('name')
"(?P<name>alex)" 首先,引号表示要匹配的内容,而括号是组的概念,证明是有联系的,?P<name>给个名字,在后面group的时候可以用到,就是起了一个组的名字
match 同search一样返回对象,但他是必须匹配开头
split 按条件分割字符串并返回列表
re.split("[ab]",'asdabcd') 【】中是按a或者b来分割 结果['', 'sd', '', 'cd'] 分三次 4个结果。分割的时候左边没有就是空
sub替换 subn 返回一个匹配次数
字符串中替换操作是replace
re.sub("\d+","A","jaskfjdkj23ljlk232fjskl322") 把字符串中的连续数字部分替换成A 三个参数,如果后面加数字参数就是决定匹配次数
compile编译好匹配规则并返回对象,然后直接用方法,规则用多次的时候使用
finditer找到结果返回迭代器对象,findall是返回列表,匹配结果非常多的时候用,存到迭代器中
a=re.finditer("\d","jfk123lkj32jkj43kj")
print(a)
for i in a:
print(i.group())
调用的时候要用到group方法
findall匹配的时候优先匹配()中的内容返回
re.findall("www\.(baidu|163)\.com","fdajlkjklwww.baidu.comjlkjlkj")
这个结果返回的是baidu
?:去优先级 re.findall("www\.(?:baidu|163)\.com","fdajlkjklwww.baidu.comjlkjlkj")
返回的结果就是www.baidu.com
a=re.findall("(abc)+","abcabcabc")
print(a)
#结果是['abc']
a=re.findall("(?:abc)+","abcabcabc")
print(a)
#结果是['abcabcabc'] 整体字符串显示