python—正则表达式
官方中文文档:https://docs.python.org/zh-cn/3/library/re.html#search-vs-match
"""<link rel="dns-prefetch" href="//wl.jd.com" />
<title>eastman - 商品搜索 - 京东</title>
<meta name="Keywords" content="eastman,京东eastman" />
<meta name="description" content="在京东找到了eastman1313件eastman的类似商品,其中包含了eastman价格、eastman评论、eastman导购、eastman图片等相关信息" />"""
- re.match() 与 re.search()
语法:re.match(pattern, string, flags=0)
尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
即便是 MULTILINE 多行模式, re.match() 也只匹配字符串的开始位置,而不匹配每行开始。
import re
text = '''<link rel="dns-prefetch" href="//wl.jd.com" />
<title>eastman - 商品搜索 - 京东</title>
'''
mo = re.match('<\w\w\w',text)
print(mo)
print(mo.group())
print(mo.start())
print(mo.span())
mo1 = re.match('rel',text)
print(mo1)
'''一般常这样用 :'''
content = 'Hello 123 456 welcome to tuling'
result = re.match('^Hello(.*)ng$', content)
print(result)
print(result.group())
print(result.groups())
print(result.group(1))
print(result.span(1))
语法:re.search(pattern, string, flags=0)
扫描整个字符串并返回第一个成功的匹配。如果搜索完了还没有找到,就返回 None。
匹配方法与re.match()相同
import re
text = '''<link rel="dns-prefetch" href="//wl.jd.com" />
<title>eastman - 商品搜索 - 京东</title>
<meta name="Keywords" content="eastman,京东eastman" />
<meta name="description" content="在京东找到了eastman1313件eastman的类似商品,其中包含了eastman价格、eastman评论、eastman导购、eastman图片等相关信息" />
'''
mo = re.search('^<meta',text,re.MULTILINE)
print(mo)
print(mo.group())
print(mo.span())
mo1 = re.search('^meta',text,re.MULTILINE)
print(mo1)
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
- re.findall() 与 re.finditer()
语法:findall(string[, pos[, endpos]])
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
注意: match 和 search 是匹配一次 findall 匹配所有。
import re
text = '''<link rel="dns-prefetch" href="//wl.jd.com" />
<title>eastman - 商品搜索 - 京东</title>
<meta name="Keywords" content="eastman,京东eastman" />
<meta name="description" content="在京东找到了eastman1313件eastman的类似商品,其中包含了eastman价格、eastman评论、eastman导购、eastman图片等相关信息" />
'''
mo = re.findall('\w\weastman',text)
print(mo)
语法:re.finditer(pattern, string, flags=0)
re.finditer 和 re.findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。迭代器中的每一个元素都是一个Match对象
import re
text = '''<link rel="dns-prefetch" href="//wl.jd.com" />
<title>eastman - 商品搜索 - 京东</title>
<meta name="Keywords" content="eastman,京东eastman" />
<meta name="description" content="在京东找到了eastman1313件eastman的类似商品,其中包含了eastman价格、eastman评论、eastman导购、eastman图片等相关信息" />
'''
mo = re.finditer('\w\weastman',text)
print(mo)
for i in mo:
print(i)
print(i.group())
- split()
语法:re.split(pattern, string, maxsplit=0, flags=0)
按照能够匹配的子串将字符串分割后返回列表。
如果 maxsplit 非零, 最多进行 maxsplit 次分隔, 剩下的字符全部返回到列表的最后一个元素。
import re
a = re.split(r'\W+', 'Words, words, words')
print(a)
如果在表达式中有圆括号,那么除被 圆括号中的表达式匹配掉的字符 外的字符也会作为元素被包含在列表里(含空白字符)
b = re.split(r'(\W+)', 'Words,\n,words, words')
print(b)
如果分隔符里有捕获组合,并且匹配到字符串的开始或结尾,那么结果将会以一个空字符串开始或结尾
c = re.split(r'\W+', '.words, words。')
print(c)
对于一个找不到匹配的字符串而言,split 不会对其作出分割
d = re.split('\s', 'helloworld')
print(d)
样式的空匹配仅在与前一个空匹配不相邻时才会拆分字符串
e = re.split('1*','helloworld')
print(e)
- re.sub()
语法:re.sub(pattern, repl, string, count=0, flags=0)
返回通过使用 repl 替换在 string 最左边非重叠出现的 pattern 而获得的字符串。 如果样式没有找到,则不加改变地返回 string。
repl 可以是字符串或函数。如repl为字符串,则其中任何反斜杠转义序列都会被处理。 也就是说,\n 会被转换为一个换行符,\r 会被转换为一个回车附,依此类推。
import re
phone = "2004-959-559 # 这是一个国外电话号码"
num = re.sub(r'#.*$', "", phone)
print("电话号码是:%s"%num)
num = re.sub(r'\D', "", phone)
print("电话号码是:%s"%num)
- compile()
语法:re.compile(pattern[, flags])
用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。
match() 或 search() 函数匹配成功后,返回的是一个match对象。该对象可使用如group()、start()、span()等方法。
import re
pattern = re.compile(r'\d+')
text = 'abcd 12315 .a'
mo = pattern.search(text)
print(mo)
print(mo.group())
- 正则表达式修饰符(可选标志)
|