正则学习随笔

1:正则是用来干嘛的?
	匹配 字符串的
2:为什么要用正则,String所提供的方法是完全匹配,当需求为模糊匹配时就没办法搞

3:元字符 . ^ $ * + ? {} [] | () \


PYTHON import re

1:re.findall('w\w{2}l','hello world')  //参数 1规则 2目标   --默认贪婪匹配

  re.findall('w..l','hello world')     //.(通配符)只能匹配一位   注意 . 打不过换行符
  re.findall('^h...o','hello world')     //^(只匹配开头)
  re.findall('w...d$','hello world')     //$(只匹配结尾)
  
  re.findall('w.*d','hello world')     //*(重复匹配 *之前 的字符[0,+oo] 可以使普通字符 可以是元字符)
  re.findall('w.+d','hello world')     //+(重复匹配 +之前 的字符[1,+oo] 可以使普通字符 可以是元字符)
  re.findall('w?d','hello world')      //?(重复匹配 +之前 的字符[0,1] 可以使普通字符 可以是元字符)
  re.findall('w{1,3}o','hello world')  //{}(重复匹配 {}中间 的字符次数或范围 可以使普通字符 可以是元字符) --{1,}表示1到正无穷
  重复总结:*[0,+oo]  +[1,+oo] ?[0,1] {}按次数而定,可以是范围
  
  re.findall('w[o,x]r','hello world')  //[](字符集 或匹配  可以使普通字符 可以是元字符)[a-z]范围   取消元字符的特殊功能
  (将元字符放入其中以后只代表一个普通的字符  例外 \ ^(取反) -)
  
  //反斜杠后跟元字符去除特殊功能  反斜杠后跟普通字符实现特殊功能  
  \d 匹配任何十进制数;相当于类[0-9]
  \D 匹配任何非数字字符;相当于类[^0-9]
  \s 匹配任何空白字符;相当于类[\t \n \r \f \v]
  \S 匹配任何非空白字符;相当于类[^\t \n \r \f \v]
  \w 匹配任何数字字母字符;相当于类[a-zA-Z0-9_]
  \W 匹配任何非数字字母字符;相当于类[^a-zA-Z0-9_]
  \b 匹配一个单词边界,也就是指单词和空格之间的位置
  re.findall('\d{11}','11111111111')  //\  


	校验数字的表达式
	数字:^[0-9]*$
	n位的数字:^\d{n}$
	至少n位的数字:^\d{n,}$
	m-n位的数字:^\d{m,n}$
	零和非零开头的数字:^(0|[1-9][0-9]*)$
	非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$
	带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})?$
	正数、负数、和小数:^(\-|\+)?\d+(\.\d+)?$
	有两位小数的正实数:^[0-9]+(.[0-9]{2})?$
	有1~3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$
	非零的正整数:^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$
	非零的负整数:^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$
	非负整数:^\d+$ 或 ^[1-9]\d*|0$
	非正整数:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$
	非负浮点数:^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
	非正浮点数:^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$
	正浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
	负浮点数:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$
	浮点数:^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$

	校验字符的表达式
	汉字:^[\u4e00-\u9fa5]{0,}$
	英文和数字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$
	长度为3-20的所有字符:^.{3,20}$
	由26个英文字母组成的字符串:^[A-Za-z]+$
	由26个大写英文字母组成的字符串:^[A-Z]+$
	由26个小写英文字母组成的字符串:^[a-z]+$
	由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$
	由数字、26个英文字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}$
	中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$
	中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$
	可以输入含有^%&',;=?$\"等字符:[^%&',;=?$\x22]+
	禁止输入含有~的字符:[^~\x22]+

	三特殊需求表达式
	Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
	域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
	InternetURL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
	手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
	电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$
	国内电话号码(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}
	身份证号(15位、18位数字):^\d{15}|\d{18}$
	短身份证号码(数字、字母x结尾):^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$
	帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
	密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$
	强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
	日期格式:^\d{4}-\d{1,2}-\d{1,2}
	一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$
	一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$
	钱的输入格式:
	i. 有四种钱的表示形式我们可以接受:"10000.00" 和 "10,000.00", 和没有 "分" 的 "10000" 和 "10,000":^[1-9][0-9]*$
	ii. 这表示任意一个不以0开头的数字,但是,这也意味着一个字符"0"不通过,所以我们采用下面的形式:^(0|[1-9][0-9]*)$
	iii. 一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号:^(0|-?[1-9][0-9]*)$
	iv. 这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧.下面我们要加的是说明可能的小数部分:^[0-9]+(.[0-9]+)?$
	v. 必须说明的是,小数点后面至少应该有1位数,所以"10."是不通过的,但是 "10" 和 "10.2" 是通过的:^[0-9]+(.[0-9]{2})?$
	vi. 这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:^[0-9]+(.[0-9]{1,2})?$
	vii. 这样就允许用户只写一位小数.下面我们该考虑数字中的逗号了,我们可以这样:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$
	viii. 1到3个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$

	备注:这就是最终结果了,别忘了"+"可以用"*"替代如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里

	xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$
	中文字符的正则表达式:[\u4e00-\u9fa5]
	双字节字符:[^\x00-\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))
	空白行的正则表达式:\n\s*\r (可以用来删除空白行)
	HTML标记的正则表达式:<(\S*?)[^>]*>.*?</\1>|<.*? /> (网上流传的版本太糟糕,上面这个也仅仅能部分,对于复杂的嵌套标记依旧无能为力)
	首尾空白字符的正则表达式:^\s*|\s*$或(^\s*)|(\s*$) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)
	腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始)
	中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)
	IP地址:\d+\.\d+\.\d+\.\d+ (提取IP地址时有用)
	IP地址:((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))
	
	
# string.capitalize()                                  把字符串的第一个字符大写
# string.center(width)                                 返回一个原字符串居中,并使用空格填充至长度 width 的新字符串
# string.count(str, beg=0, end=len(string))            返回 str 在 string 里面出现的次数,如果 beg 或者 end 指定则返回指定范围内 str 出现的次数
# string.decode(encoding='UTF-8', errors='strict')     以 encoding 指定的编码格式解码 string,如果出错默认报一个 ValueError 的 异 常 , 除 非 errors 指 定 的 是 'ignore' 或 者'replace'
# string.encode(encoding='UTF-8', errors='strict')     以 encoding 指定的编码格式编码 string,如果出错默认报一个ValueError 的异常,除非 errors 指定的是'ignore'或者'replace'
# string.endswith(obj, beg=0, end=len(string))         检查字符串是否以 obj 结束,如果beg 或者 end 指定则检查指定的范围内是否以 obj 结束,如果是,返回 True,否则返回 False.
# string.expandtabs(tabsize=8)                         把字符串 string 中的 tab 符号转为空格,tab 符号默认的空格数是 8。
# string.find(str, beg=0, end=len(string))             检测 str 是否包含在 string 中,如果 beg 和 end 指定范围,则检查是否包含在指定范围内,如果是返回开始的索引值,否则返回-1
# string.index(str, beg=0, end=len(string))            跟find()方法一样,只不过如果str不在 string中会报一个异常.
# string.isalnum()                                     如果 string 至少有一个字符并且所有字符都是字母或数字则返回 True,否则返回 False
# string.isalpha()                                     如果 string 至少有一个字符并且所有字符都是字母则返回 True,否则返回 False
# string.isdecimal()                                   如果 string 只包含十进制数字则返回 True 否则返回 False.
# string.isdigit()                                     如果 string 只包含数字则返回 True 否则返回 False.
# string.islower()                                     如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是小写,则返回 True,否则返回 False
# string.isnumeric()                                   如果 string 中只包含数字字符,则返回 True,否则返回 False
# string.isspace()                                     如果 string 中只包含空格,则返回 True,否则返回 False.
# string.istitle()                                     如果 string 是标题化的(见 title())则返回 True,否则返回 False
# string.isupper()                                     如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是大写,则返回 True,否则返回 False
# string.join(seq)                                     以 string 作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串
# string.ljust(width)                                  返回一个原字符串左对齐,并使用空格填充至长度 width 的新字符串
# string.lower()                                       转换 string 中所有大写字符为小写.
# string.lstrip()                                      截掉 string 左边的空格
# string.maketrans(intab, outtab])                     maketrans() 方法用于创建字符映射的转换表,对于接受两个参数的最简单的调用方式,第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标。
# max(str)                                             返回字符串 str 中最大的字母。
# min(str)                                             返回字符串 str 中最小的字母。
# string.partition(str)                                有点像 find()和 split()的结合体,从 str 出现的第一个位置起,把 字 符 串 string 分 成 一 个 3 元 素 的 元 组 (string_pre_str,str,string_post_str),如果 string 中不包含str 则 string_pre_str == string.
# string.replace(str1, str2,  num=string.count(str1))  把 string 中的 str1 替换成 str2,如果 num 指定,则替换不超过 num 次.
# string.rfind(str, beg=0,end=len(string) )            类似于 find()函数,不过是从右边开始查找.
# string.rindex( str, beg=0,end=len(string))           类似于 index(),不过是从右边开始.
# string.rjust(width)                                  返回一个原字符串右对齐,并使用空格填充至长度 width 的新字符串
# string.rpartition(str)                               类似于 partition()函数,不过是从右边开始查找.
# string.rstrip()                                      删除 string 字符串末尾的空格.
# string.split(str="", num=string.count(str))          以 str 为分隔符切片 string,如果 num有指定值,则仅分隔 num 个子字符串
# string.splitlines(num=string.count('\n'))            按照行分隔,返回一个包含各行作为元素的列表,如果 num 指定则仅切片 num 个行.
# string.startswith(obj, beg=0,end=len(string))        检查字符串是否是以 obj 开头,是则返回 True,否则返回 False。如果beg 和 end 指定值,则在指定范围内检查.
# string.strip([obj])                                  在 string 上执行 lstrip()和 rstrip()
# string.swapcase()                                    翻转 string 中的大小写
# string.title()                                       返回"标题化"的 string,就是说所有单词都是以大写开始,其余字母均为小写(见 istitle())
# string.translate(str, del="")                        根据 str 给出的表(包含 256 个字符)转换 string 的字符,要过滤掉的字符放到 del 参数中
# string.upper()                                       转换 string 中的小写字母为大写

  

posted @ 2018-09-17 14:56  鲸落-k  阅读(125)  评论(0编辑  收藏  举报