# 正则表达式

# 使用

soup = re.compile(r"正则表达式")
for item in soup.findall(文本):
    print(item)

# 匹配规则

元字符转义:在匹配字符前加\即可表示字符本身

  • \d : 匹配 0-9 之间任意一个数字字符,等价于表达式 [0-9]
  • \D : 匹配任意一个不是 0-9 之间的数字字符,等价于表达式 [^0-9]
  • \s : 匹配任意一个空白字符,包括 空格、tab、换行符等,等价于表达式 [\t\n\r\f\v]
  • \S : 匹配任意一个非空白字符,等价于表达式 [^ \t\n\r\f\v]
  • \w : 匹配任意一个文字字符,包括大小写字母、数字、下划线,等价于表达式 [a-zA-Z0-9_] 缺省情况也包括 Unicode 文字字符,如果指定 ASCII 码标记,则只包括 ASCII 字母
  • \W : 匹配任意一个非文字字符,等价于表达式 [^a-za-z0-9_]

# 匹配所有字符:.

. 表示匹配除了换行符之外的任何单个字符

text = """
苹果是绿色的
橙子是橙色的
香蕉是黄色的
乌鸦是黑色的
"""

soup = re.compile(r".色")
for item in soup.findall(text):
    print(item)

"""
输出:
  绿色
  橙色
  黄色
  黑色
"""

# 重复匹配任意次:*

*表示匹配前面的子表达式任意次,包括 0 次

text = """
苹果,是绿色的
橙子,是橙色的
香蕉,是黄色的
乌鸦,是黑色的
猴子,
"""

# 匹配"."任意次
soup = re.compile(r",.*")
for item in soup.findall(text):
    print(item)

"""
输出:
,是绿色的
,是橙色的
,是黄色的
,是黑色的
,
"""

# 重复匹配多次:+

+表示匹配前面的子表达式一次或多次,不包括 0 次,至少需要出现一次

text = """
苹果,是绿色的
橙子,是橙色的
香蕉,是黄色的
乌鸦,是黑色的
猴子,
"""

soup = re.compile(r",.+")
for item in soup.findall(text):
    print(item)


"""
输出:
,是绿色的
,是橙色的
,是黄色的
,是黑色的
"""

# 匹配指定次数:{}

{n}表示匹配前面的子表达式 n 次 {n,m}表示匹配前面的子表达式,最少 n 次,最多 m 次

text = """
红彤彤,绿油油,黑乎乎,绿油油油油
"""

soup = re.compile(r"绿.{2}")
for item in soup.findall(text):
    print(item)

"""
输出:
绿油油
绿油油
"""

# 匹配几个字符之一: []

[]表示匹配方括号内的任意一个字符,方括号内也可出现匹配符(.不适用)
如果在方括号内使用^,表示方括号内的字符集合

text = """
张三,手机号码15945678901
李四,手机号码13945677701
王二,手机号码13845666901
"""
# 匹配13或15开头的手机号码
soup = re.compile(r"1[35]\d{9}")
for item in soup.findall(text):
    print(item)

# 匹配13-16开头的手机号码
soup = re.compile(r"1[3-6]\d{9}")
for item in soup.findall(text):
    print(item)

# 起始位置

^表示匹配文本的开头位置

  • 如果是 单行模式 ,表示匹配 整个文本 的开头位置
  • 如果是 多行模式 ,表示匹配 文本每行 的开头位置

# 结尾位置

$表示匹配文本的结尾位置

  • 如果是 单行模式 ,表示匹配 整个文本 的结尾位置
  • 如果是 多行模式 ,表示匹配 文本每行 的结尾位置

# 多行模式

在 Python 中,默认为单行模式(基于所有文本内容)

soup = re.compile(r"正则表达式", re.M)
for item in soup.findall(文本):
    print(item)

# 分组

就是把 正则表达式 匹配的内容 里面 其中的某些部分 标记为某个组
以提取已经匹配的 内容里面的 某些部分的核心内容

text = """
苹果,苹果是绿色的
橙子,橙子是橙色的
香蕉,香蕉是黄色的
"""

soup = re.compile(r"(.+),")
for item in soup.findall(text):
    print(item)

"""
输出:
    苹果
    橙子
    香蕉
"""
text = """张三,手机号码15945678901
李四,手机号码13945677701
王二,手机号码13845666901"""

# 将姓名、手机号码 进行分组显示
soup = re.compile(r"(.+),.+(\d{11})")
for item in soup.findall(text):
    print(item)

"""
输出:
    ('张三', '15945678901')
    ('李四', '13945677701')
    ('王二', '13845666901')
"""

# 贪婪模式和非贪婪模式

*+?都是尽可能的多的匹配内容,加上?可使用非贪婪模式

text = """
<html><head><title>Title</title>
"""

soup = re.compile(r"<.*?>")
for item in soup.findall(text):
    print(item)


"""
不加? 输出:['<html><head><title>Title</title>']
输出:
  <html>
  <head>
  <title>
  </title>
"""

# 分割字符串

text = re.split(r"正则表达式", 文本)
print(text)
text = "关羽; 张飞, 赵云,马超, 黄忠  李逵"

soup = re.split(r"[;,\s]\s*", text)
print(soup)

"""
输出:
    ['关羽', '张飞', '赵云', '马超', '黄忠', '李逵']
"""
最后更新: 2020/9/15 19:42:22