python-正则表达式和re模块

正则表达式

正则表达式是一个特殊的字符串,由普通字符和特殊字符(元字符)组成,正则表达式的应用场景和领域非常广泛,几乎所有的编程语言都支持。正则表达式主要用来在大量的文本中,找到符合某个规律的字符串。

元字符
  • 普通字符:几乎是平常所见的字符(因为,其中某些字符在正则表达式中具有特殊的含义,不属于普通字符)。

  • 元字符:在正则表达式中具有特殊功能的字符,如果想要匹配字符串中的元字符,需要在前面加上\进行转义。常见的元字符如下:

    元字符 描述
    \ 转移字符
    ^ 后面的内容在字符串的行首
    $ 前面的内容在字符串的行尾
    * 前面一个字符的个数大于等于0
    + 前面一个字符的个数大于等于1
    ? 前面一个字符的个数为0或1
    前面一个字符的个数为n
    前面一个字符的个数大于等于n
    前面一个字符的个数在n到m之间,包含n和m
    ? 与控制数量的元字符连用表示匹配模式改为非贪婪模式,例如*?
    . 代表任意一个字符(换行符除外)
    () 根据括号里的表达式,找到并获取该字符串
    (?😃 根据括号里的表达式,找到但不获取该字符串
    (?=) 括号前的内容,在原字符串中,后面必须紧跟括号里正则表达式对应的内容
    (?!) 括号前的内容,在原字符串中,后面不能跟括号里正则表达式对应的内容
    (?<=) 括号前的内容,在原字符串中,前面必须有括号里正则表达式对应的内容
    (?<!) 括号前的内容,在原字符串中,前面不能有括号里正则表达式对应的内容
    | 表示或。z|food表示匹配z或者food,[z|f]ood表示匹配zood或food
    [] 匹配方括号中任意一个字符(各个字符之间不要用逗号隔开)
    [^] 匹配方括号里字符以外的任意一个字符
    \b 代表非字符。如果要找A,\bA表示A的前面不能有字符;A\b表示A的后面不能有字符。可以指定该字符属于Unicode还是ASCII,默认属于Unicode。
    \B 代表字符。如果要找A,\BA表示A的前面必须有字符,A\B表示A的后面必须有字符。
    \d 代表一个数字
    \D 代表一个非数字字符
    \s 代表一个空白字符
    \S 代表一个非空白字符
    \w 代表任意一个字,如一个字母、一个汉字等,默认是出现在Unicode中的字
    \W 代表任意一个符号
import re
#\A
pattern = r'\Ahttp'
url = 'https://www.baidu.com'
#url = '123http;//www.baidu.com'
pattern = re.compile(pattern)
result = pattern.findall(url)
print(result)

#\Z
pattern = r'.com\Z'
url = 'https://www.baidu.com'
#url = '123http;//www.baidu.com.com'
pattern = re.compile(pattern)
result = pattern.findall(url)
print(result)

#^
pattern = r'^http'
url = 'https://www.baidu.com'
#url = '123http;//www.baidu.com'
pattern = re.compile(pattern=pattern)
result = pattern.findall(url)
print(result)

#$
pattern = r'\Ahttp'
url = 'https://www.baidu.com'
#url = '123http;//www.baidu.com'
pattern = re.compile(pattern=pattern)
result = pattern.findall(url)
print(result)

#\b
pattern = r'\bhttp'
url = 'https://www.baidu.com'
#url = '百度http;//www.baidu.com'
pattern = re.compile(pattern)
#pattern = re.compile(pattern,re.A)
result = pattern.findall(url)
print(result)

#\B
pattern = r'\Bhttp'
url = '百度https://www.baidu.com'
#url = 'http;//www.baidu.com'
pattern = re.compile(pattern)
result = pattern.findall(url)
print(result)

re模块

为了避免正则表达式中的元字符与python中某些特殊字符发生冲突,比如\,需要在正则表达式的前面加上r,表示该字符串是一个正则表达式,例如:

pattern = r'(.*)http \n'
re模块中常用的方法
函数 功能
compile 将正则表达式编译为正则对象
findall 找到文本中所有能匹配的部分,第一个参数为正则表达式,第二个参数为文本(字符串)
match 在文本开头处匹配,并且只匹配一个结果
search 找到文本中能匹配
split 将匹配内容作为分隔符,对文本进行分割
sub 将匹配到的内容,替换成新字符串。第一个参数为正则表达式,第二个参数为新字符串。
subn 与sub作用一样,并且还能额外统计匹配到的个数
compile对象常用的方法
函数 功能
findall 找到文本中所有能匹配的部分,结果返回一个列表
match 在文本开头处匹配,并且只匹配一个结果
search 找到文本中能匹配
split 将匹配内容作为分隔符,对文本进行分割
sub 将匹配到的内容,替换成新字符串。
subn 与sub作用一样,并且还能额外统计匹配到的个数

compile的这些方法与re模块中的方法是一样的,只不过返回的结果更加人性化,调用起来也更加简单,不用再传入正则表达式作为参数了。

import re

#compile()
pattern = r'b.*u'
url = 'www.baidu.com'
pattern_obj = re.compile(pattern,re.I)
result = re.findall(pattern,url)
print(result)

#escape()
str = 'secape()'
result = re.escape(str)
print(result)

#findall()
pattern = r'baidu'
str = 'www.baidu.com-www.BAIDU.com-www.BaiDu.com'
result = re.findall(pattern,str,re.I)
print(result)

#finditer()
pattern = r'baidu'
str = 'www.baidu.com-www.BAIDU.com-www.BaiDu.com'
result = re.finditer(pattern,str,re.I)
print(result)
for item in result:
    print(item)

#match()
pattern = r'www'
str = 'www.baidu.com'
result = re.match(pattern,str)
print(result)

#search()
pattern = r'baidu'
str = 'www.BaiDu.com-www.baidu.com-www.BAIDU.com'
result = re.search(pattern,str,re.I)
print(result)

#split()
pattern = r'\.'
str = '.www.baidu.com'
result = re.split(pattern,str,2)
print(result)

#sub()
pattern = r'师父'
sub_str = '唐僧'
str = '师父的大徒弟是猴子,师父的二徒弟是你,师父的三徒弟是沙僧'
result = re.sub(pattern,sub_str,str,2)
print(result)

#subn()
pattern = r'师父'
sub_str = '唐僧'
str = '师父的大徒弟是猴子,师父的二徒弟是你,师父的三徒弟是沙僧'
result = re.subn(pattern,sub_str,str,2)
print(result)

posted @ 2021-08-20 15:17  尹少欣  阅读(116)  评论(0)    收藏  举报