re.findall(pattern, string)
import re
re.findall("hello", "hello world")
['hello']
re.findall("您好", "您好北京")
['您好']
print(re.findall("ab|cd", "abcdefghijk"))
print(re.findall("abc|cde", "abcdefghijk")) # 不匹配已经匹配过的
['ab', 'cd']
['abc']
re.findall("f.o", "foo is not fao f o f@o")
['foo', 'fao', 'f o', 'f@o']
re.findall("^Tom", "Tom is a boy")
['Tom ']
re.findall("boy$", "Tom is a boy")
['boy']
re.findall("fo*", "fadsfafooooafo") # 匹配o出现0次或多次
['f', 'f', 'foooo', 'fo']
re.findall("fo+", "fadsfafooooafo")
['foooo', 'fo']
re.findall("fo?", "fadsfafooooafo")
['f', 'f', 'fo', 'fo']
re.findall("fo{2}", "fadsfafooooafo")
['foo']
re.findall("fo{2,4}", "fadsfafooooafoo")
['foooo', 'foo']
匹配所用字符表达为:.+或.*
re.findall("[A-Z][a-z]*", "Boy")
['Boy']
re.findall("[^ ]+", "a little boy")
['a', 'little', 'boy']
re.findall("1\d{10}", "17857024541")
['17857024541']
re.findall("\w+", "hello#nihao%adsd@afsd!df&")
['hello', 'nihao', 'adsd', 'afsd', 'df']
re.findall("\W+","hello#nihao%asdf@adsgdfg!df&")
['#', '%', '@', '!', '&']
re.findall("\w+\s+\w+", "hello world")
['hello world']
re.findall("\S+", "hello this is tom")
['hello', 'this', 'is', 'tom']
绝对匹配:正则表达式要完全匹配目标字符串内容
- 在正则表达式开始和结束位置加上^ $ (或者\A \Z)。这样正则表达式必须匹配整个目标字符串才会有结果
re.findall("\A\d+\Z","123445")
['123445']
re.findall(r"num\b", "num#asdf#")
['num']
re.findall(r"num\b", "numasdf#")
[]
元字符总结
匹配单个字符 : a . \d \D \w \W \s \S
[...] [^...]
匹配重复 : * + ? {n} {m,n}
匹配位置 : ^ $ \A \Z \b \B
其他 : | () \
正则表达式如果匹配特殊字符需要加 ?表达转义
正则 目标字符串
e.g. \$\d+ ----> $10
pattern string
python "\\$\\d+" "$10"
raw r"\$\d+" "$10"
raw字串 : 原始字符串对内容不解释转义,就表达内容原本意义
贪婪模式 : 正则表达式的重复匹配总是尽可能多的向后匹配更多内容
* + ? {m,n}
非贪婪(懒惰模式) : 尽可能少的匹配内容
贪婪 ---> 非贪婪 *? +? ?? {m,n}?
re.findall(r"ab+?", "abbbbbbbb")
['ab']
re.findall(r"ab??", "abbbbbbbb")
['a']
作为内部整体可以改变某些元字符的行为
re.search(r"(ab)+\d+","ababab1234").group()
‘ababab1234‘
re.search(r"\w+@\w+\.(com|cn)","abc@123.com").group()
'abc@123.com'
子组在某些操作中可以单独提取出匹配内容
re.search(r"(https|http|ftp)://\S+","https://www.baidu.com").group(1)
Out[121]: ‘https‘
(?P<name>pattern)
全面性 ,需要对目标的各种情况进行考虑,做到不遗漏
regex = compile(pattern,flags = 0)
功能 : 生成正则表达式对象
参数 : pattern 正则表达式
flags 功能标志位,丰富正则表达式的匹配功能
返回值 : 返回正则表达式对象
re.findall(pattern,string,flags)
功能 :从目标字符串查找正则匹配内容
参数 : pattern 正则表达式
string 目标字符串
flags 标志位
返回值 : 返回匹配到的内容
如果正则有子组则只返回子组对应内容
regex.findall(string,pos,endpos)
功能 :从目标字符串查找正则匹配内容
参数 : string 目标字符串
pos 匹配目标的起始位置
endpos 匹配目标的终止位置
返回值 : 返回匹配到的内容
如果正则有子组则只返回子组对应内容
re.split(pattern,string,flags = 0)
功能:根据正则匹配内容切割字符串
参数: pattern string flags
返回值: 返回列表,列表中为切割的内容
re.sub(pattern,replaceStr,string,max,flags)
功能: 替换正则匹配到的目标子串部分
参数: pattern
replaceStr : 要替换的内容
string
max 最多替换几处 默认全部替换
flags
返回值 : 返回替换后的字符串
re.subn(pattern,replaceStr,string,max,flags)
功能: 替换正则匹配到的目标子串部分
参数: pattern
replaceStr : 要替换的内容
string
max 最多替换几处 默认全部替换
flags
返回值 : 返回一个元组,为实际替换了几处和替换后的字符串
re.finditer(pattern,string,flags)
功能: 使用正则表达式匹配目标字符串
参数: pattern string flags
返回值: 返回一个迭代对象,迭代到的内容是一个match对象
fullmatch(pattern,string,flags)
功能: 完全匹配目标字符串
参数: pattern,string,flags
返回值:返回匹配到的match对象
如果没匹配成功返回None
match(pattern,string,flags)
功能: 从开头位置匹配目标字符串
参数: pattern,string,flags
返回值:返回匹配到的match对象
如果没匹配成功返回None
search(pattern,string,flags)
功能: 正则表达式匹配目标字符串,只匹配第一处
参数: pattern,string,flags
返回值:返回匹配到的match对象
如果没匹配成功返回None
compile对象属性:
flags : 标志位
pattern : 正则表达式
groups: 有多少子组
groupindex : 捕获组形成组名和序列号的字典
组名为键,第几组为值
pattern = r"(ab)cd(ef)"
s = "abcdefghigkabcdef"
#re模块直接调用
l = re.findall(pattern,s)
print(l)
#compile对象调用
regex = re.compile(pattern)
l = regex.findall(s)
print(l)
print("==================================")
l = re.split(r"\s+","Hello world nihao China")
print("split():",l)
s = re.sub(r"\s+","#",'Hello world nihao China',2)
print("sub():",s)
s = re.subn(r"\s+","#",'Hello world nihao China')
print("subn():",s)
[('ab', 'ef'), ('ab', 'ef')]
[('ab', 'ef'), ('ab', 'ef')]
==================================
split(): ['Hello', 'world', 'nihao', 'China']
sub(): Hello#world#nihao China
subn(): ('Hello#world#nihao#China', 3)
import re
it = re.finditer(r'\d+',"2008-2018 10年, 中国发生了翻天覆地的变化")
for i in it:
print(i.group())
#fullmatch
try:
obj = re.fullmatch(r"\w+",'abcdef123')
print(obj.group())
except AttributeError as e:
print(e)
#match
obj = re.match(r'foo',"foo,food on the table")
print(obj.group())
#search
obj = re.search(r'foo',"Foo,food on the table")
print(obj.group())
2008
2018
10
abcdef123
foo
foo
import re
pattern = r"(?P<dog>ab)cd(?P<pig>ef)"
regex = re.compile(pattern)
#获取match对象
match_obj = regex.search("abcdefghij",pos = 0,endpos = 6)
print(match_obj.pos) #匹配目标字符串的开始位置
print(match_obj.endpos) #匹配目标字符串的结束位置
print(match_obj.re) #正则表达式
print(match_obj.string) #目标字符串
print(match_obj.lastgroup) #最后一组的组名
print(match_obj.lastindex) #最后一组是第几组
print("=============================")
print(match_obj.start()) #匹配内容的开始位置
print(match_obj.end()) #匹配内容的结束位置
print(match_obj.span()) #匹配内容的起止位置
print(match_obj.group(0)) #获取整个match对象内容
print(match_obj.group(2)) #获取第二个子组匹配内容
print(match_obj.group('dog')) #获取dog子组匹配内容
print(match_obj.groupdict()) #获取捕获组字典
print(match_obj.groups()) #获取每个子组匹配内容
0
6
re.compile('(?P<dog>ab)cd(?P<pig>ef)')
abcdefghij
pig
2
=============================
0
6
(0, 6)
abcdef
ef
ab
{'dog': 'ab', 'pig': 'ef'}
('ab', 'ef')
re.compile re.findall re.search re.match
re.finditer re.fullmatch re.sub re.subn re.split
import re
s = '''hello world
hello kitty
你好,北京'''
pattern = r'''H\w+ #匹配第一个单词
\s+ #匹配多个空格
[a-z]+ #匹配其他
'''
regex = re.compile(pattern,flags = re.X | re.I)
try:
s = regex.search(s).group()
except:
print("没有匹配到内容")
else:
print(s)
hello world
原文:https://www.cnblogs.com/haoenwei/p/10760477.html