正则表达式
元字符
ctrl + enter 表格快速添加一个行
Ctrl+ shift + delete 表格快速删除一行
元字符 | 说明 |
---|---|
.字符 | 匹配除了换行符之外的任何单个字符 |
*字符 | 匹配前表达式任意次,包括0次,尽量多的匹配字符串 |
+ | 匹配前面的子表达式一次或多次,但不包括0次 |
? | 匹配前面的子表达式0次或1次 |
\ | 表示对元字符进行转义 |
[] | 表示匹配[] 中几个字符之一 |
{} | 表示{}前面的字符匹配指定的次数 |
() | 表示组选择 |
\d | [0-9] |
\D | [^0-9] |
\s | [\t\n\r\f\v] |
\S | [^\t\n\f\v] |
\w | 匹配任意一个文字字符 |
\W | [^a-zA-Z-9] |
贪婪模式和非贪婪模式
贪:<.*> 所谓的贪婪就是从第一个合适的位置开始进行匹配,直到最后一个符合位置为止
# 贪婪模式
source = '<html><head><title>Title</title>'
p = re.compile(r'<.*>')
print(p.findall(source))
# ['<html><head><title>Title</title>']
非贪: <.*?> 非贪婪就是从第一个合适的位置开始到下一个符合的位置为止
# 非贪婪模式
source = '<html><head><title>Title</title>'
p = re.compile(r'<.*?>')
print(p.findall(source))
# ['<html>', '<head>', '<title>', '</title>']
re库
p = r'\d{3}'
res = re.match(p,'a123')
print(res)
# None
# match 是从起始位置为0的开始寻找,但当第一个位置不符合返回值为空,返回值为一个对象
res = re.search(p,'a123')
print(res)
#search 搜索的范围是全局,但第一个位置不符合时会从下一个开始进行匹配,返回值为一个对象
切分与分组
re库中也存在split() 切分方法
当需要切分的条件较多,这时再使用 字符串中的split()只能设置一个条件 这时就需要re库中的split() 切分方法,使用正则表达式添加多个切分条件
p = r'[\s\t,;]'
res = re.split(p,'asa jkjk,123 df;sfdjj')
print(res)
# ['asa', 'jkjk', '123', '', 'df', 'sfdjj'] 结果是以列表的形式返回
分组group(参数) 当中的参数表示正则表达式中()括号 分成的个数
p = '^(\d{3})-(\d{3,8})$'
res = re.match(p,'021-12345')
print(res)
# <re.Match object; span=(0, 9), match='021-12345'>
res = re.match(p,'021-12345').group(0)
print(res)
# 021-12345
res = re.match(p,'021-12345').group(1)
print(res)
# 021
res = re.match(p,'021-12345').group(2)
print(res)
# 12345
替换
sub()单单返回替换后的内容
subn() 返回替换后的内容的同时还返回替换的次数
p = re.compile(r'\d{3}')
str = '123sadsa234sdf543dgds'
print(p.sub('XXX',str))
# XXXsadsaXXXsdfXXXdgds
print(p.subn('XXX',str))
# ('XXXsadsaXXXsdfXXXdgds', 3)
other
修饰符 | 描述 |
---|---|
re.I | 使匹配对大小写不敏感 |
re.L | 做本地化识别(locale-aware)匹配 |
re.M | 多行匹配,影响 ^ 和 $ |
re.S | 使 . 匹配包括换行在内的所有字符 |
re.U | 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B. |
re.X | 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。 |
花了一下午的时间学习了一下正则表达式的一些基本操作方法,正则表达式是真多东西,大家要踊跃翻阅blog