1,通佩符:
通配符:
*: 代表任何字符串
?: 代表单个字符
.: 当前目录
…:当前目录的上一级目录
[0-9]: 单个字符为0~9
[a-z]: 代表小写的a-z
[A-Z]: 代表大写的A-Z
[A-Za-z]:同时代表大小写的
[0-9A-Za-Z]:代表大小写之外同时还包括0-9
[[:digit:]]:匹配任意数字
[[:upper:]]:匹配大写字母
[[:lower:]]:匹配小写字母
[[:space:]]:匹配任意个空格
#示例:
import glob
glob.glob(’./[0-9].*’)
[’./1.gif’, ‘./2.txt’]glob.glob(’*.gif’)
[‘1.gif’, ‘card.gif’]glob.glob(’?.gif’)
[‘1.gif’]glob.glob(’**/*.txt’, recursive=True)
[‘2.txt’, ‘sub/3.txt’]glob.glob(’./**/’, recursive=True)
[’./’, ‘./sub/’]
import glob
glob.glob(’*.gif’)
[‘card.gif’]glob.glob(’.c*’)
[’.card.gif’]
“”"
import os
import glob
files1 = [file for file in os.listdir(’.’) if file.endswith(’.conf’)]
获取当前目录所有以.conf结尾的文件;
files2= glob.glob(’./*.conf’)
print(files1)
print(files2)
正则表达式常用方法:
import re
# *************************match方法*************************8
# match尝试从字符串的起始位置开始匹配;
# - 如果起始位置没有匹配成功, 返回None;
# - 如果起始位置匹配成功, 返回一个对象, 通过group方法获取匹配的内容;
# Try to apply the pattern at the start of the string, returning
# a match object, or None if no match was found.
aObj = re.match(r'we', 'wetoshello')
print(aObj)
print(aObj.group())
# \d 单个数字
# \D \d的取反 , 除了数字之外
bObj = re.match(r'\d', '1westos')
if bObj:
print(bObj.group())
bObj = re.match(r'\D', '_westos')
if bObj:
print(bObj.group())
# *****************************findall********************
# findall会扫描整个字符串, 获取匹配的所有内容;
res = re.findall(r'\d\d', '阅读数为2 点赞数为10')
print(res)
# *************************search*******************8
# search会扫描整个字符串, 只返回第一个匹配成功的内容的SRE对象;
# - 如果起始位置没有匹配成功, 返回None;
# - 如果起始位置匹配成功, 返回一个对象, 通过group方法获取匹配的内容;
resObj = re.search(r'\d', '阅读数为8 点赞数为10')
if resObj:
print(resObj.group())
正则匹配的特殊字符类
.: 匹配除了\n之外的任意字符; [.\n]
\d: digit--(数字), 匹配一个数字字符, 等价于[0-9]
\D: 匹配一个非数字字符, 等价于[^0-9]
\s: space(广义的空格: 空格, \t, \n, \r), 匹配单个任何的空白字符;
\S: 匹配除了单个任何的空白字符;
\w: 字母数字或者下划线, [a-zA-Z0-9_]
\W: 除了字母数字或者下划线, [^a-zA-Z0-9_]
示例:
import re
# 匹配数字
# pattern = r'\d'
pattern = r'[0-9]'
string = "hello_1$%"
print(re.findall(pattern, string))
# 匹配字母数字或者下划线;
# pattern = r'\w'
pattern = r'[a-zA-Z0-9_]'
string = "hello_1$%"
print(re.findall(pattern, string))
# 匹配除了字母数字或者下划线;
# pattern = r'\W'
pattern = r'[^a-zA-Z0-9_]'
string = "hello_1$%"
print(re.findall(pattern, string))
# .: 匹配除了\n之外的任意字符; [.\n]
print(re.findall(r'.', 'hello westos\n\t%$'))
练习
1. 设计一个正则来找出一个字符串序列中的10-59;
pattern = r'[1-5][0-9]'
2. 设计一个正则来过滤一个字符串序列中只包含两个字符, 其中第一个字母是大写的A或者B或者C;
pattern = r'[ABC].'
正则表达式之分组操作
表示分组
| : 匹配| 左右任意一个表达式即可;
(ab): 将括号中的字符作为一个分组
\num: 引用分组第num个匹配到的字符串
(?P): 分组起别名
(?P=name) : 引用分组的别名
import re
print(re.findall(r'westos|hello', "hellowestos"))
# 进行分组的时候, findall方法只返回分组里面的内容;
print(re.findall(r'(http|https)(.+)', 'http_hello'))
# search
sreObj = re.search(r'(http|https)(.+)', 'http_hello')
if sreObj:
# group方法会返回匹配的所有内容;
print(sreObj.group())
# groups方法返回分组里面的内容;
print(sreObj.groups())
# 需求: 获取标签里面的文字, 并判断标签是否成对出现?
htmlStr = "<html><p>welcome to westos!</p></html>"
pattern = r'<(\w+)><(\w+)>(.+)</\2></\1>'
print(re.findall(pattern, htmlStr))
print(re.findall(pattern, htmlStr)[0][2])
# 需求: 分组起别名?
htmlStr = "<html><p>welcome to westos!</p></html>"
pattern = r'<(?P<FirstTag>\w+)><(?P<SecondTag>\w+)>(?P<Text>.+)' \
r'</(?P=SecondTag)></(?P=FirstTag)>'
print(re.findall(pattern, htmlStr))
sreObj = re.search(pattern, htmlStr)
if sreObj:
print(sreObj.group())
print(sreObj.groups())
print(sreObj.groupdict())
print(sreObj.groupdict()['Text'])
679

被折叠的 条评论
为什么被折叠?



