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的是原生字符串

python中re模块的findall python中的re.findall_字符串

 

|管道符 或者的意思优先级比括号高         

()括号,代表分组,()内的内容自动优先显示出来,(?: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']  整体字符串显示