行业知识
开发知识点-Python-爬虫
2026-11-06 21:21:26
来源:互联网转载
爬虫
- scrapy
- beautifulsoup
- find_all
- find
- 祖先/父节点
- 兄弟节点
- next
- previous
- CSS选择器
- 属性值 attrs
- select 后 class
- 正则
- 使用字符串来描述、匹配一系列符合某个规则的字符串
- 组成
- 元字符
- 使用grep匹配正则
- 组与捕获
- 断言与标记
- 条件匹配
- 正则表达式的标志
- ���定中文 匹配
scrapy
scrapy内置的选择器包含re、css、xpath选择器,依赖lxml
beautifulsoup
从网页上抓取信息。它位于HTML或XML解析器之上,为迭代、搜索和修改解析树提供了Pythonic习惯用法。(优雅的、地道的、整洁的)代码>>> from bs4 import BeautifulSoup>>> soup = BeautifulSoup("SomebadHTML")>>> print(soup.prettify())
Some bad HTML
>>> soup.find(text="bad")'bad'>>> soup.iHTML#>>> soup = BeautifulSoup("SomebadXML", "xml")#>>> print(soup.prettify()) Some bad XMLfind_all
# soup.find_all(name=['p','p'])# find_all( name , attrs/class_ , recursive , string , **kwargs )# name:标签名搜索# attrs/class_:属性/类名搜索# recursive:限定直接子节点# string:文档字符串搜索# soup.find(attrs={'data-custom':'custom'})# soup.find_all("a", "sister") #class_="sister"# soup.find_all("a", string="Elsie")# soup.find_all(string=re.compile("Dormouse"))# soup.find_all(string=["Tillie", "Elsie", "Lacie"])# soup.find_all("a")# soup("a")嵌套查询:for ul in soup.find_all(name='节点名1'): print(ul.find_all(name='节点名1内的节点名')) 2:attrs:根据 属性print(soup.find_all(attrs={'属性': '属性值'})) 得到列表形式,包含的内容就是符合“属性”为“属性值”的所有节点3:text:(根据)传入的形式可以是字符串,可以是正则表达式对象(pattern)可用来匹配 节点的文本print(soup.find_all(text= str / pattern )) 传入pattern:结果返回 所有匹配正则表达式 的节点文本 组成的列表response.content utf-8soup = bs(response.content, 'html.parser')ResultSet 实际上依赖解析器,它 除了支持Python标准库中的HTML解析器外,还支持一些第三方解析器(比如lxml)可以把要解析的字符串以标准的缩进格式输出CSS 路径节点选择器——根据属性**来选择直接调用节点的名称就可以选择节点元素,再调用string属性就可以得到节点内的文本了1:这种选择方式速度非常快:2:如果单个节点结构层次非常清晰,可以选用这种方式来解析soup.title.string()输出HTML中title节点的文本内容注:soup.title可以选出HTML中的title节点,再调用string属性就可以得到里面的文本了——调用string属性来获取文本的值提取信息1:获取节点的名称——调用nameprint(soup.title.name)2:获取属性和属性值——调用attrs(获取所有属性,一个节点 有时候不止一个属性)返回字典{}形式,并且 把选择的节点的所有属性和属性值组合成一个字典{'class': ['title'], 'name': 'dromouse'}有的返回结果是字符串,比如,name属性的值是唯一的,返回的结果就是单个字符串。有的返回结果是字符串组成的列表。对于class,一个节点元素可能有多个class,所以返回的是列表。∴在实际处理过程中,我们要注意判断类型如果要获取name属性值,就相当于从字典中获取某个键值,只需要用中括号加属性名就可以了。比如,要获取name属性值,就可以通过attrs[‘name’]来得到 点元素后面加中括号,传入属性名就可以获取属性值了。不写attrsprint(soup.p['name'])# ——输出dromouse 3:获取 节点元素 包含的文本内容——调用stringprint(soup.p.string) 获取的是 第一个 p节点的文本嵌套选择:每一个返回结果都是bs4.element.Tag类型,它可以被继续调用 来进行下一步的选择eg:获取了head节点元素(Tag类型),我们可以继续调用head 来选取其内部的head节点元素关联选择:在做选择的时候,有时候不能做到一步就选到想要的节点元素,需要先选中某一个节点元素,然后以它为基准再选择它的子节点、父节点、兄弟节点等——嵌套选择同理 (1)子节点、子孙节点选取节点元素之后,如果想要获取它的直接子节点,可以调用contents属性contents属性 :得到的结果是直接子节点的列表调用children属性也可以得到相应的结果,返回的是生成器类型,接着用for循环输出相应的内容如果要得到所有的子孙节点的话,可以调用 descendants属性(2)父节点、祖先节点如果要获取某个节点元素的父节点,可以调用 parent属性 ——直接父节点,没有再向外寻找父节点的祖先节点如果想获取所有的祖先节点,可以调用 parents属性——返回结果:生成器类型(3)兄弟节点(同级节点)next_sibling 和 previous_sibling 分别获取节点的下一个和上一个兄弟元素next_siblings 和 previous_siblings 则分别返回所有前面和后面的兄弟节点 的生成器 关联元素节点的信息 提取:1:如果返回结果是单个节点,那么可以直接调用string、attrs等属性获得其文本和属性:2:如果返回结果是多个节点的生成器,则可以转为列表后取出某个元素,然后再调用string、attrs等属性获取其对应节点的文本和属性print(list(soup.a.parents)[0].attrs['class'])方法选择器——调用方法选择find_all :返回 所有 匹配成功元素 所组成的列表1:name:根据节点名 查询元素print(soup.find_all(name='节点名'))find
祖先/父节点
find()ps: 返回 第一个匹配的元素 (单个)用法 和 find_all 相同find_parents()前者返回所有祖先节点,find_parent()后者返回直接父节点。
兄弟节点
find_next_siblings()前者返回后面所有的兄弟节点,find_next_sibling()后者返回后面第一个兄弟节点。find_previous_siblings()前者返回前面所有的兄弟节点,find_previous_sibling()后者返回前面第一个兄弟节点。
next
find_all_next()前者返回节点后所有符合条件的节点,find_next()后者返回第一个符合条件的节点。
previous
find_all_previous()前者返回节点后所有符合条件的节点,find_previous()后者返回第一个符合条件的节点。
CSS选择器
只需要调用select()方法,传入相应的CSS选择器输出——列表形式1:嵌套选择:select()方法——先选择所有父节点,再遍历每个父节点,选择其子节点for ul in soup.select('ul'): print(ul.select('li')) 2:获取属性节点类型是Tag类型,所以获取属性还可以用原来的方法(attrs)3:获取文本同理,可以调用string属性另外,get_text()from bs4 import BeautifulSoupsoup = BeautifulSoup(html, 'lxml')for li in soup.select('li'): print('Get Text:', li.get_text()) print('String:', li.string) select 的功能跟find和find_all 一样用来选取特定的标签,它的选取规则依赖于css,我们把它叫做css选择器ul_ = soup.select('html body p.wapper section.in-main p.n.w_index section.main p.contents p.column_cont.fixed p.column_right p.vulbar ul.vul_list li')bs4.element.Tag属性值 attrs
soup = BeautifulSoup(html, 'lxml')print(soup.select("#list-2 li"))for li in soup.select("#list-2 li"): print(type(li)) print(li.attrs) print(li.attrs['class'])select 后 class
beautifulsoup是一个用于解析和提取HTML和XML文档的Python库,它提供了一些方法和属性来操作文档树。其中一个方法是select,它可以接受一个CSS选择器作为参数,返回一个匹配的标签列表。如果想要对select的结果进行class查询,可以使用列表推导式或循环遍历结果列表,然后使用get或has_attr方法来获取或判断标签的class属性。以下是一些使用select方法和class查询的示例代码:# 导入beautifulsoup模块from bs4 import BeautifulSoup# 定义一个HTML文档字符串html = """
Hello
World
Foo
Bar
"""# 创建一个BeautifulSoup对象,解析HTML文档soup = BeautifulSoup(html, "html.parser")# 使用select方法,根据CSS选择器查找所有的p标签ps = soup.select("p")# 使用列表推导式,从结果列表中筛选出有C类的p标签ps_with_C = [p for p in ps if p.get("class") and "C" in p.get("class")]# 打印筛选后的结果print(ps_with_C)# 使用select方法,根据CSS选择器查找所有的p标签ps = soup.select("p")# 使用循环遍历结果列表,判断每个p标签是否有E类,并打印相应信息for p in ps: if p.has_attr("class") and "E" in p["class"]: print(p, "has E class") else: print(p, "does not have E class")正则
使用字符串来描述、匹配一系列符合某个规则的字符串
搜索匹配特定模式的语句,而这种模式及具体的 ASCII 序列或 Unicode 字符。从解析/替代字符串
组成
普通字符:大小写字母、数字、标点符号及一些其他符号元字符:在正则表达式中具有特殊意义的专用字符
元字符
\用来转义字符,\!、\n等 特殊字符:\.^$?+*{}[]()|*************************************以上特殊字符要想使用字面值,必须使用\进行转义^ 锚点匹配字符串开始 表示^本身的行位置$ 锚点匹配字符串结束的行位置*匹配前面 子表达式0次或者多次abc* 匹配在“ab”后面跟着零个或多个“c”的字符串a(bc)* 匹配在“a”后面跟着零个或更多“bc”序列的字符串+匹配前面 子表达式1次以上abc+ 匹配在“ab”后面跟着一个或多个“c”的字符串abc ?匹配前面 子表达式0次或者1次 匹配在“ab”后面跟着零个或一个“c”的字符串{m} 匹配前面表达式m次abc{2} 匹配在“ab”后面跟着两个“c”的字符串{m,} 匹配前面表达式至少m次abc{2,} 匹配在“ab”后面跟着两个或更多“c”的字符串{,n} 匹配前面的正则表达式最多n次{m,n} 匹配前面的正则表达式至少m次,最多n次abc{2,5} 匹配在“ab”后面跟着2到5个“c”的字符串a(bc){2,5} 匹配在“a”后面跟着2到5个“bc”序列的字符串以上量词都是贪婪模式,会尽可能多的匹配,如果要改为非贪婪模式,通过在量词后面跟随一个?来实现()将括号中的字符串作为一个整体|以或的方式匹配字条串a(b|c) 匹配在“a”后面跟着“b”或“c”的字符串a[bc] 匹配在“a”后面跟着“b”或“c”的字符串[list]匹配list列表中的一个字符 包含在[]中的一个或者多个字符被称为字符类在匹配时如果没有指定量词则只会匹配其中的一个内部可以使用速记法,比如\d \s \w[^list]匹配任意不在list列表中的一个字符字符类内可以指定范围 例: [^a-z]、[^0-9]、[^A-Z0-9] 否定一个字符类 [abc] 匹配带有一个“a”、“ab”或“ac”的字符串 与 a|b|c 一样 [a-c] 匹配带有一个“a”、“ab”或“ac”的字符串与 a|b|c 一样 [a-fA-F0-9] 匹配一个代表16进制数字的字符串,不区分大小写 [0-9]% 匹配在%符号前面带有0到9这几个字符的字符串 [^a-zA-Z] 匹配不带a到z或A到Z的字符串,其中^为否定表达式 记住在方括弧内,所有特殊字符(包括反斜杠\)都会失去它们应有的意义。 .匹配除\n之外的任意的一个字符如果有re.DOTALL标志,则匹配任意字符包括换行`\d 匹配一个Unicode数字, 数字型的单个字符 如果带re.ASCII,则匹配0-9$\d 匹配在单个数字前有符号“$”的字符串`\D` 匹配Unicode非数字匹配单个非数字型的字符`\s` 匹配Unicode空白,如果带有re.ASCII,则匹配`\t\n\r\f\v`中的一个匹配单个空格字符(包括制表符和换行符)`\S` 匹配Unicode非空白`\w` 匹配Unicode单词字符,如果带有re.ascii,则匹配`[a-zA-Z0-9_]`中的一个匹配单个词字(字母加下划线)`\W`匹配Unicode非单子字符non-printable 字符Tab 符「\t」、换行符「\n」和回车符「\r」 前向匹配和后向匹配:(?=) 和 (?[^>]+?) #图片名字 (?P=quote) #右括号 """,re.VERBOSE|re.IGNORECASE)match = re.compile('.*?target="_blank">(.*?) .*? ', re.S)contents = re.findall(match, page_html) 属性值正则匹配选择器 [attr^="val"][attr$="val"][attr*="val"] 字符匹配,而非单词匹配尖角符号^、美元符号$以及星号*都是正则表达式中的特殊标识符,分别表示前匹配、后匹配和任意匹配(.*?) .*?.*?>(.*?) .*?nowrap="nowrap">(.*?)' + '.*?(.*?).*?[\u4e00-\u9fa5] 匹配中文字符[^\x00-\xff] 匹配双字节字符(包括汉字在内)\n\s*\r匹配空白行[\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?匹配Email地址 [a-zA-z]+://[^\s]*匹配网址URL \d{3}-\d{8}|\d{4}-\{7,8}匹配国内电话号码 [1-9][0-9]{4,}匹配腾讯QQ号[1-9]\d{5}(?!\d) 校验数字的表达式数字:^[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,3 或 ^\+?[1-9][0-9]*$非零的负整数:^\-[1-9][]0-9"*或−[1−9]\d∗或−[1−9]\d∗非负整数:^\d+或[1−9]\d∗|0或[1−9]\d∗|0非正整数:^-[1-9]\d*|0或((−\d+)|(0+))或((−\d+)|(0+))非负浮点数:^\d+(\.\d+)?或[1−9]\d∗\.\d∗|0\.\d∗[1−9]\d∗|0?\.0+|0或[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?\.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]∗))或(([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]∗)))或(−(([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)或−?([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或[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+或\w3,20或\w3,20中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+或[\u4E00−\u9FA5A−Za−z0−9]2,20或[\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}电话号码正则表达式(支持手机号码,3-4位区号,7-8位直播号码,1-4位分机号): ((\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{4}|\d{3})-(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})|(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1}))$)身份证号(15位、18位数字),最后一位是校验位,可能为数字或字符X:(^\d{15})|(\d18)|(\d18)|(^\d{17}(\d|X|x)$)帐号是否合法(字母开头,允许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)$钱的输入格式: 有四种钱的表示形式我们可以接受:"10000.00" 和 "10,000.00", 和没有 "分" 的 "10000" 和 "10,000":^[1-9][0-9]*$这表示任意一个不以0开头的数字,但是,这也意味着一个字符"0"不通过,所以我们采用下面的形式:^(0|[1-9][0-9]*)$一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号:^(0|-?[1-9][0-9]*)$这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧。下面我们要加的是说明可能的小数部分:^[0-9]+(.[0-9]+)?$必须说明的是,小数点后面至少应该有1位数,所以"10."是不通过的,但是 "10" 和 "10.2" 是通过的:^[0-9]+(.[0-9]{2})?$这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:^[0-9]+(.[0-9]{1,2})?$这样就允许用户只写一位小数.下面我们该考虑数字中的逗号了,我们可以这样:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$ 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*|\s*或(\s∗)|(\s∗或(\s∗)|(\s∗) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始)中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)IP地址:((?:(?:25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d?\d)) 一、校验数字的表达式数字:^[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]+禁止输入含有~的字符:[^~]+三、特殊需求表达式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[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-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}电话号码正则表达式(支持手机号码,3-4位区号,7-8位直播号码,1-4位分机号): ((\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{4}|\d{3})-(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})|(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1}))$)身份证号(15位、18位数字),最后一位是校验位,可能为数字或字符X:(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)帐号是否合法(字母开头,允许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])[a-zA-Z0-9]{8,10}$强密码(必须包含大小写字母和数字的组合,可以使用特殊字符,长度在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)$钱的输入格式:有四种钱的表示形式我们可以接受:"10000.00" 和 "10,000.00", 和没有 "分" 的 "10000" 和 "10,000":^[1-9][0-9]*$这表示任意一个不以0开头的数字,但是,这也意味着一个字符"0"不通过,所以我们采用下面的形式:^(0|[1-9][0-9]*)$一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号:^(0|-?[1-9][0-9]*)$这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧。下面我们要加的是说明可能的小数部分:^[0-9]+(.[0-9]+)?$必须说明的是,小数点后面至少应该有1位数,所以"10."是不通过的,但是 "10" 和 "10.2" 是通过的:^[0-9]+(.[0-9]{2})?$这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:^[0-9]+(.[0-9]{1,2})?$这样就允许用户只写一位小数.下面我们该考虑数字中的逗号了,我们可以这样:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$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*|\s*$或(^\s*)|(\s*$) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始)中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)IPv4地址:((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}'''re.sub(pattern, repl, string, count=0, flags=0)re.sub的参数:5个参数参数1:pattern表示正则中的模式字符串。参数2:repl就是replacement,表示被替换的字符串,可以是字符串也可以是函数。参数3:string表示要被处理和替换的原始字符串参数4:count可选参数,表示是要替换的最大次数,而且必须是非负整数,该参数默认为0,即所有的匹配都会被替换;参数5:flags可选参数,表示编译时用的匹配模式(如忽略大小写、多行模式等),数字形式,默认为0。 '''
二、Python正则表达式模块(一)正则表达式处理字符串主要有四大功能匹配 查看一个字符串是否符合正则表达式的语法,一般返回true或者false获取 正则表达式来提取字符串中符合要求的文本替换 查找字符串中符合正则表达式的文本,并用相应的字符串替换分割 使用正则表达式对字符串进行分割。(二) Python中re模块使用正则表达式的两种方法使用re.compile(r, f)方法生成正则表达式对象,然后调用正则表达式对象的相应方法。这种做法的好处是生成正则对象之后可以多次使用。re模块中对正则表达式对象的每个对象方法都有一个对应的模块方法,唯一不同的是传入的第一个参数是正则表达式字符串。此种方法适合于只使用一次的正则表达式。(三)正则表达式对象的常用方法rx.findall(s,start, end):返回一个列表,如果正则表达式中没有分组,则列表中包含的是所有匹配的内容,如果正则表达式中有分组,则列表中的每个元素是一个元组,元组中包含子分组中匹配到的内容,但是没有返回整个正则表达式匹配的内容rx.finditer(s, start, end):返回一个可迭代对象对可迭代对象进行迭代,每一次返回一个匹配对象,可以调用匹配对象的group()方法查看指定组匹配到的内容,0表示整个正则表达式匹配到的内容rx.search(s, start, end):返回一个匹配对象,倘若没匹配到,就返回Nonesearch方法只匹配一次就停止,不会继续往后匹配rx.match(s, start, end):如果正则表达式在字符串的起始处匹配,就返回一个匹配对象,否则返回Nonerx.sub(x, s, m):返回一个字符串。每一个匹配的地方用x进行替换,返回替换后的字符串,如果指定m,则最多替换m次。对于x可以使用/i或者/gid可以是组名或者编号来引用捕获到的内容。模块方法re.sub(r, x, s, m)中的x可以使用一个函数。此时我们就可以对捕获到的内容推过这个函数进行处理后再替换匹配到的文本。rx.subn(x, s, m):与re.sub()方法相同,区别在于返回的是二元组,其中一项是结果字符串,一项是做替换的个数。rx.split(s, m):分割字符串,返回一个列表,用正则表达式匹配到的内容对字符串进行分割如果正则表达式中存在分组,则把分组匹配到的内容放在列表中每两个分割的中间作为列表的一部分,如:rx = re.compile(r"(\d)[a-z]+(\d)") s = "ab12dk3klj8jk9jks5" result = rx.split(s)返回['ab1', '2', '3', 'klj', '8', '9', 'jks5']rx.flags():正则表达式编译时设置的标志rx.pattern():正则表达式编译时使用的字符串(四)匹配对象的属性与方法m.group(g, ...)返回编号或者组名匹配到的内容,默认或者0表示整个表达式匹配到的内容,如果指定多个,就返回一个元组m.groupdict(default)返回一个字典。字典的键是所有命名的组的组名,值为命名组捕获到的内容如果有default参数,则将其作为那些没有参与匹配的组的默认值。m.groups(default)返回一个元组。包含所有捕获到内容的子分组,从1开始,如果指定了default值,则这个值作为那些没有捕获到内容的组的值m.lastgroup()匹配到内容的编号最高的捕获组的名称,如果没有或者没有使用名称则返回None(不常用)m.lastindex()匹配到内容的编号最高的捕获组的编号,如果没有就返回None。m.start(g)当前匹配对象的子分组是从字符串的那个位置开始匹配的,如果当前组没有参与匹配就返回-1m.end(g)当前匹配对象的子分组是从字符串的那个位置匹配结束的,如果当前组没有参与匹配就返回-1m.span()返回一个二元组,内容分别是m.start(g)和m.end(g)的返回值m.re()产生这一匹配对象的正则表达式m.string()传递给match或者search用于匹配的字符串m.pos()搜索的起始位置。即字符串的开头,或者start指定的位置(不常用)m.endpos()搜索的结束位置。即字符串的末尾位置,或者end指定的位置(不常用)(五) 总结对于正则表达式的匹配功能,Python没有返回true和false的方法,但可以通过对match或者search方法的返回值是否是None来判断对于正则表达式的搜索功能,如果只搜索一次可以使用search或者match方法返回的匹配对象得到,对于搜索多次可以使用finditer方法返回的可迭代对象来迭代访问对于正则表达式的替换功能,可以使用正则表达式对象的sub或者subn方法来实现,也可以通过re模块方法sub或者subn来实现,区别在于模块的sub方法的替换文本可以使用一个函数来生成对于正则表达式的分割功能,可以使用正则表达式对象的split方法,需要注意如果正则表达式对象有分组的话,分组捕获的内容也会放到返回的列表中 match = re.compile('.*?target="_blank">(.*?).*? ', re.S) contents = re.findall(match, page_html) w匹配的仅仅是中文,数字,字母,对于国人来讲,仅匹配中文时常会用到,见下匹配中文字符的正则表达式: [u4e00-u9fa5]或许你也需要匹配双字节字符,中文也是双字节的字符匹配双字节字符(包括汉字在内):[^x00-xff]注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1) 更多常用正则表达式匹配规则:英文字母:[a-zA-Z]数字:[0-9]匹配中文,英文字母和数字及_:^[u4e00-u9fa5_a-zA-Z0-9]+$同时判断输入长度:[u4e00-u9fa5_a-zA-Z0-9_]{4,10}^[wu4E00-u9FA5uF900-uFA2D]*$1、一个正则表达式,只含有汉字、数字、字母、下划线不能以下划线开头和结尾:^(?!_)(?!.*?_$)[a-zA-Z0-9_u4e00-u9fa5]+$其中: ^ 与字符串开始的地方匹配(?!_) 不能以_开头(?!.*?_$) 不能以_结尾[a-zA-Z0-9_u4e00-u9fa5]+ 至少一个汉字、数字、字母、下划线$ 与字符串结束的地方匹配************************放在程序里前面加@,否则需要加\进行转义 @"^(?!_)(?!.*?_$)[a-zA-Z0-9_u4e00-u9fa5]+$"(或者:@"^(?!_)w*(?(.*?) .*?(.*?).*?nowrap="nowrap">(.*?)' +'.*?(.*?).*?
上一篇:服务器ip被封怎么解封?