正则表达式
正则表达式是一个特殊的字符串,由普通字符和特殊字符(元字符)组成,正则表达式的应用场景和领域非常广泛,几乎所有的编程语言都支持。正则表达式主要用来在大量的文本中,找到符合某个规律的字符串。
元字符
-
普通字符:几乎是平常所见的字符(因为,其中某些字符在正则表达式中具有特殊的含义,不属于普通字符)。
-
元字符:在正则表达式中具有特殊功能的字符,如果想要匹配字符串中的元字符,需要在前面加上\进行转义。常见的元字符如下:
元字符 描述 \ 转移字符 ^ 后面的内容在字符串的行首 $ 前面的内容在字符串的行尾 * 前面一个字符的个数大于等于0 + 前面一个字符的个数大于等于1 ? 前面一个字符的个数为0或1 {n} 前面一个字符的个数为n {n,} 前面一个字符的个数大于等于n {n,m} 前面一个字符的个数在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)