正则

2019-07-24  本文已影响0人  xiaohan_zhang

导入re模块
import re
使用match方法进行匹配操作
result = re.match(正则表达式,要匹配的字符串)
如果上一步匹配到数据的话,可以使用group方法来提取数据
result.group()

import re
result = re.match("[hH]el", 'hello xiaobai')
print(result.group())
参数 含义
. 匹配任意1个字符(除了\n)
[] 匹配[]中列举的字符串
\d 匹配数字,即0-9
\D 匹配非数字,即不是数字
\s 匹配空白,即空格、tab键(用的比较少)
\S 匹配非空白
\w 匹配单词字符,即a-z、A-Z、0-9、_、中文字符(慎用这个)
\W 匹配非单词字符
参数 含义
* 匹配前一个字符出现0次或无限次,即可有可无
+ 匹配前一个字符出现1次或无限次,即至少有1次
匹配前一个字符出现0次或1次,即至多1次
{m} 匹配前一个字符出现m次
{m,n} 匹配前一个字符出现m-n次
参数 含义
^ 匹配字符串开头
$ 匹配字符串结尾
print(re.match(r".*a$", "dsa"))     # 以a结尾
print(re.match(r"^a.*", "as"))      # 以a开头
参数 含义
| 匹配左右任意一个表达式
() 将()中字符作为一个分组
\num 引用分组num匹配到的字符串
(?P<name>) 分组起别名 (了解)
(?P=name) 引用别名为name分组匹配到的字符串(了解)
result = re.match(r"a(111|222)b", "a111b")   # a b 中间是111或222
print(result.group())   # a111b
print(result.group(1))  # 111
result = re.match(r"(a)(111|222)b", "a111b")
print(result.group(1))  # a
print(re.match(r"[1-9]?\d$", "0"))
# \1 表示取出第一个分组的匹配结果
print(re.match(r"<(\w*)>.*</\1>", "<h1>hahhaah</h1>")) # 前后都是h1
print(re.match(r"<(\w*)><(\w*)>.*</\2></\1>", "<body><h1>hahhaah</h1></body>"))

print(re.match(r"<(?P<first>\w*)>.*</(?P=first)>", "<h1>hahhaah</h1>"))
  1. search
    search不会从头匹配,只要匹配到符合要求的数据的地方 就匹配到了
ret = re.search(r"\d+", "阅读次数为 998 333")
print(ret.group())  # 998
  1. findall
ret = re.findall(r"\d+", "python = 9999, c = 3432, c++ = 23344")
print(ret)  # ['9999', '3432', '23344']
  1. sub
    将匹配到的数据进行替换
#方法一
ret = re.sub(r"\d+", "998", "python = 888")
print(ret)  # python = 998


# 方法二
def add(temp):
    strNum = temp.group()
    num = int(strNum) + 1
    return str(num)


ret = re.sub(r"\d+", add, "python = 777")
print(ret)  # python = 778
  1. splite
    根据匹配进行切割字符串,并返回一个列表
ret = re.split(r":| ", "info:xiaoli 22 shandong")
print(ret)  # ['info', 'xiaoli', '22', 'shandong']
上一篇 下一篇

猜你喜欢

热点阅读