一、re.match函数
re.match()函数从字符串的起始位置匹配一个模式,若起始位置匹配成功返回匹配对象,若匹配失败则返回none
1、语法
re.match(pattern , string , flags = 0)
2、参数
参数 | 说明 |
---|---|
pattern | 匹配的正则表达式 |
string | 要匹配的字符串 |
flags | 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等,参考:正则表达式修饰符 - 可选标志 |
3、re.match()返回对象处理
re.match()函数可使用如下方法处理返回对象
方法名称 | 作用说明 |
---|---|
start() | 返回匹配开始位置 |
end() | 返回匹配结束位置 |
span() | 以元组tuple形式返回匹配的范围 |
group() | 以str形式返回对象中match的元素 |
注意:以上方法不适用于re.findall()函数,因为re.findall()返回的是一个列表list
注意:当匹配结果为none时,无法使用start、end、span和group方法,报
AttributeError: ‘NoneType’ object has no attribute 'start’错误
# re.match()函数
import re
restr = "kobe"
str1 = "there is a player , his name is koke , kobe is a An American , kobe is still a legend ; I miss you , kobe"
str2 = "kobe is a An American , kobe is still a legend ; I miss you , kobe"
matchstr1 = re.match(restr , str1)
matchstr2 = re.match(restr , str2)
print("matchstr1:" , matchstr1)
print("matchstr2:" , matchstr2)
print("matchstr2.start():" , matchstr2.start())
print("matchstr2.end():" , matchstr2.end())
print("matchstr2.span():" , matchstr2.span())
print("matchstr2.group():" , matchstr2.group())
print("type(matchstr2.group()):" , type(matchstr2.group()))
print("matchstr1.start():" , matchstr1.start())
matchstr1: None
matchstr2: <re.Match object; span=(0, 4), match='kobe'>
matchstr2.start(): 0
matchstr2.end(): 4
matchstr2.span(): (0, 4)
matchstr2.group(): kobe
type(matchstr2.group()): <class 'str'>
Traceback (most recent call last):
File "G:/ZX_01_正则表达式_match函数.py", line 22, in <module>
print("matchstr1.start():" , matchstr1.start())
AttributeError: 'NoneType' object has no attribute 'start'
4、group()方法和groups()方法
4.1、group()方法
正则表达式中,group()方法用来提取分组截获的字符串,其中()用来分组。
组是通过 “(” 和 “)” 元字符来标识的,它们一起把在它们里面的表达式组成一组。例如可以用重复限制符,如 、 +、?、{m,n}来重复组里的内容,比如说(ab) 将匹配零或更多个重复的 “ab”。
如果不引入括号,将整个表达式作为一个组,是group(0)。
一般,re.match().group(N) 代表返回第N组括号匹配的字符,当re.match().group(M)中M不存在时,报错。
re.match().group() == re.match().group(0) == 所有匹配的字符,与括号无关。
group(0)匹配的是整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下其返回一个包含那些组所对应值的元组。
# 1、group()方法
import re
str = "123abc456def"
restr = "([0-9]*)([a-zA-Z]*)([0-9]*)([a-zA-Z]*)" # 匹配类似“1a2”字符串
match = re.match(restr , str)
print("match.group():" , match.group()) # group()同group(0),匹配正则表达式整体结果
print("match.group(0):" , match.group(0)) # group()同group(0),匹配正则表达式整体结果
print("match.group(1):" , match.group(1)) # 匹配group(1)结果
print("match.group(2):" , match.group(2)) # 匹配group(2)结果
print("match.group(3):" , match.group(3)) # 匹配group(3)结果
print("match.group(4):" , match.group(4)) # 匹配group(4)结果
print("match.group(5):" , match.group(5)) # group(5)不存在报错
match.group(): 123abc456def
match.group(0): 123abc456def
match.group(1): 123
match.group(2): abc
match.group(3): 456
match.group(4): def
Traceback (most recent call last):
File "G:/group和groups方法.py", line 14, in <module>
print("match.group(5):" , match.group(5))
IndexError: no such group
4.2、groups()方法
re.match().groups() 返回所有括号匹配的字符,以tuple格式(元组格式),不包括re.match().group(0),即整个表达式。
re.match().groups() == (re.match().group(0), re.match().group(1), …)
# 2、groups()方法
import re
phoneNumRegex = re.compile(r'(\d\d\d)-(\d\d\d\d\d)-(\d\d\d)')
str = '021-12345-666 is My phone number .'
match = re.match(phoneNumRegex , str)
print("match.group(0):" , match.group(0))
print("match.group(1):" , match.group(1))
print("match.group(2):" , match.group(2))
print("match.group(3):" , match.group(3))
print("match.groups():" , match.groups())
match.group(0): 021-12345-666
match.group(1): 021
match.group(2): 12345
match.group(3): 666
match.groups(): ('021', '12345', '666')
二、re.search函数
re.search()函数用于扫描整个字符串并返回第一个成功的匹配,匹配成功re.search()函数返回一个匹配的对象,否则返回None
re.search()函数与re.match()函数一样可以使用start、end、span、group和groups方法处理返回对象
re.search()函数和re.match()函数区别:
re.match()函数只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回 None,而 re.search() 函数匹配整个字符串,直到找到一个匹配为止
1、语法
re.search(pattern , string , flags = 0)
2、参数
参数 | 说明 |
---|---|
pattern | 匹配的正则表达式 |
string | 要匹配的字符串 |
flags | 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等,参考:正则表达式修饰符 - 可选标志 |
# re.search()函数
import re
restr = "kobe"
str1 = "there is a player , his name is koke , kobe is a An American , kobe is still a legend ; I miss you , kobe"
str2 = "kobe is a An American , kobe is still a legend ; I miss you , kobe"
searchstr1 = re.search(restr , str1)
searchstr2 = re.search(restr , str2)
print("searchstr1:" , searchstr1)
print("searchstr2:" , searchstr2)
print("searchstr1.start():" , searchstr1.start())
print("searchstr1.end():" , searchstr1.end())
print("searchstr1.span():" , searchstr1.span())
print("searchstr1.group():" , searchstr1.group())
print("type(searchstr1.group()):" , type(searchstr1.group()))
# 2、group和groups方法
phoneNumRegex = re.compile(r'(\d\d\d)-(\d\d\d\d\d)-(\d\d\d)')
str = 'My phone number is 021-12345-666 .'
search = re.search(phoneNumRegex , str)
print("search.group(0):" , search.group(0))
print("search.group(1):" , search.group(1))
print("search.group(2):" , search.group(2))
print("search.group(3):" , search.group(3))
print("search.groups():" , search.groups())
searchstr1: <re.Match object; span=(39, 43), match='kobe'>
searchstr2: <re.Match object; span=(0, 4), match='kobe'>
searchstr1.start(): 39
searchstr1.end(): 43
searchstr1.span(): (39, 43)
searchstr1.group(): kobe
type(searchstr1.group()): <class 'str'>
search.group(0): 021-12345-666
search.group(1): 021
search.group(2): 12345
search.group(3): 666
search.groups(): ('021', '12345', '666')
三、re.sub检索和替换
re.sub()函数用于替换字符串中的匹配项
1、语法
re.sub( pattern , replace , string , count , flags = 0 )
2、参数
pattern:正则中的模式字符串,必选参数
replace:替换的字符串,也可以是一个函数,必选参数
string:要被查找替换的原始字符串,必选参数
count:模式匹配后替换的最大次数,默认 0 表示替换所有的匹配,可选参数
flags:编译时用的匹配模式,数字形式,可选参数
# sub()函数用于检索和替换
# 1、repl参数是一个字符串
import re
phone = "This is a phone number , 021-12345678-666"
# 提取电话号码
restr1 = r'[^0-9-*$]'
# 移除非数字内容
restr2 = r'\D' # \D等价于[^0-9]
match1 = re.sub(restr1 , '' , phone)
match2 = re.sub(restr2 , "" , phone)
print("phone - match1:" , match1)
print("phone - match2:" , match2)
# 2、repl参数是一个函数
# 将匹配到的小写字符大写,大写字符小写:swapcase()可实现大小写字符转换
def swapcasestr(match):
return match.group('result').swapcase()
Str = 'abdjd1U90UJ0JKJNI0QI00893783Y4YjojoDSAIOWJPJP19179U9'
print("替换前:" , Str)
# ?P<result> 的意思是命名一个名字为 result 的组,匹配规则符合后面的\D+
print("替换后:" , re.sub('(?P<result>\D+)' , swapcasestr , Str))
phone - match1: 021-12345678-666
phone - match2: 02112345678666
替换前: abdjd1U90UJ0JKJNI0QI00893783Y4YjojoDSAIOWJPJP19179U9
替换后: ABDJD1u90uj0jkjni0qi00893783y4yJOJOdsaiowjpjp19179u9
四、re.compile函数
compile() 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 re.match() 和 re.search() 函数使用,匹配成功时返回一个 Match 对象
1、group([group1, …]) 方法用于获得一个或多个分组匹配的字符串,当要获得整个匹配的子串时,可直接使用 group() 或 group(0);
2、start([group]) 方法用于获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认值为 0;
3、end([group]) 方法用于获取分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),参数默认值为 0;
4、span([group]) 方法返回 (start(group), end(group));
1、语法
re.compile(pattern , flags)
2、参数
pattern : 必填参数,一个字符串形式的正则表达式
flags:可选参数,表示匹配模式,比如忽略大小写,多行模式等,具体参数有:
1、re.I:忽略大小写
2、re.L:表示特殊字符集 \w、\W、\b、\B、\s、\S 依赖于当前环境
3、re.M:多行模式
4、re.S:即为’ . ‘并且包括换行符在内的任意字符(’ . ‘不包括换行符)
5、re.U:表示特殊字符集 \w、\W、\b、\B、\d、\D、\s、\S 依赖于 Unicode 字符属性数据库
6、re.X:为了增加可读性,忽略空格和’ # '后面的注释
# re.compile()函数
import re
str1 = 'one12two34three56four78'
str2 = 'Hello Kobe , Hello GIGI'
pattern1 = re.compile(r"\d+") # 用于匹配至少一个数字
pattern2 = re.compile("([a-z]+) ([a-z]+)" , re.I) # re.I 表示忽略大小写
match1 = pattern1.match(str1) # 起始位置匹配,匹配失败
print("pattern1起始位置匹配:" , match1)
match2 = pattern1.match(str1 , 2 , 4) # 从“e”位置匹配,匹配失败
print("从“e”位置匹配:" , match2)
match3 = pattern1.match(str1 , 3 , 5) # 从“1”位置匹配,匹配成功
print("从“1”位置匹配:" , match3) # 返回一个 Match 对象
print("match3.start():" , match3.start(0)) # 可省略 0
print("match3.end():" , match3.end(0)) # 可省略 0
print("match3.span():" , match3.span(0)) # 可省略 0
print("match3.group():" , match3.group(0)) # 可省略 0
match4 = pattern2.match(str2)
print("match4:" , match4) # 匹配成功,返回一个 Match 对象
print("match4.group():" , match4.group()) # 返回匹配成功的整个子串
print("match4.group(0):" , match4.group(0)) # 返回匹配成功的整个子串
print("match4.span(0):" , match4.span(0)) # 返回匹配成功的整个子串的索引
print("match4.group(1):" , match4.group(1)) # 返回第一个分组匹配成功的子串
print("match4.span(1):" , match4.span(1)) # 返回第一个分组匹配成功的子串的索引
print("match4.group(2):" , match4.group(2)) # 返回第二个分组匹配成功的子串
print("match4.span(2):" , match4.span(2)) # 返回第二个分组匹配成功的子串的索引
print("match4.groups():" , match4.groups()) # 等价于 (match4.group(1), match4.group(2), ...)
print("match4.group(3):" , match4.group(3)) # 不存在第三个分组
Traceback (most recent call last):
File "G:/Python/Runoob/ZX_23_Python正则表达式/ZX_04_正则表达式_compile函数.py", line 36, in <module>
print("match4.group(3):" , match4.group(3)) # 不存在第三个分组
IndexError: no such group
pattern1起始位置匹配: None
从“e”位置匹配: None
从“1”位置匹配: <re.Match object; span=(3, 5), match='12'>
match3.start(): 3
match3.end(): 5
match3.span(): (3, 5)
match3.group(): 12
match4: <re.Match object; span=(0, 10), match='Hello Kobe'>
match4.group(): Hello Kobe
match4.group(0): Hello Kobe
match4.span(0): (0, 10)
match4.group(1): Hello
match4.span(1): (0, 5)
match4.group(2): Kobe
match4.span(2): (6, 10)
match4.groups(): ('Hello', 'Kobe')
五、re.findall函数
re.findall()函数用于在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的子串,则返回空列表。
注意:re.match() 和 re.search()函数仅匹配一次,re.findall()函数则匹配所有。
1、语法一
re.compile.findall(string , pos , endpos)
2、语法一参数
string:待匹配字符串,必填参数
pos:可选参数,指定字符串的起始位置,默认为 0
endpos:可选参数,指定字符串的结束位置,默认为字符串的长度
3、语法二
re.findall(pattern , string , flags = 0)
4、语法二参数
参数 | 说明 |
---|---|
pattern | 匹配的正则表达式 |
string | 要匹配的字符串 |
flags | 标志位,一般为0,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等,参考:正则表达式修饰符 - 可选标志 |
# re.findall()函数
import re
pattern1 = re.compile(r'\d+') # 匹配数字字符
pattern2 = re.compile(r'kobe' , re.I) # 匹配所有“kobe”,不区分大小写
str1 = "abc 123 def 321 ijk 987"
str2 = "there is a player , his name is kobe , Kobe is a An American , kobe is still a legend ; I miss you , kobe"
match1 = pattern1.findall(str1 , 2 , len(str1))
match2 = re.findall(pattern2 , str2 , flags=0)
print("match1:" , match1)
print("type(match1):" , type(match1))
print("match2:" , match2)
print("type(match2):" , type(match2))
match1: ['123', '321', '987']
type(match1): <class 'list'>
match2: ['kobe', 'Kobe', 'kobe', 'kobe']
type(match2): <class 'list'>
六、re.finditer函数
re.finditer()函数用于在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。
1、语法一
re.compile.finditer(string , pos , endpos)
2、语法一参数
string:待匹配字符串,必填参数
pos:可选参数,指定字符串的起始位置,默认为 0
endpos:可选参数,指定字符串的结束位置,默认为字符串的长度
3、语法二
re.finditer(pattern , string , flags = 0)
4、语法二参数
参数 | 说明 |
---|---|
pattern | 匹配的正则表达式 |
string | 要匹配的字符串 |
flags | 标志位,一般为0,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等,参考:正则表达式修饰符 - 可选标志 |
# re.finditer()函数
import re
pattern1 = re.compile(r'\d+') # 匹配数字字符
pattern2 = re.compile(r'kobe' , re.I) # 匹配所有“kobe”,不区分大小写
str1 = "abc 123 def 321 ijk 987"
str2 = "there is a player , his name is kobe , Kobe is a An American , kobe is still a legend ; I miss you , kobe"
match1 = pattern1.finditer(str1 , 2 , len(str1))
match2 = re.finditer(pattern2 , str2 , flags=0)
for match in match1:
print(match)
print(match.group())
print("type(match1):" , type(match1))
for match in match2:
print(match)
print(match.group())
print("type(match2):" , type(match2))
<re.Match object; span=(4, 7), match='123'>
123
<re.Match object; span=(12, 15), match='321'>
321
<re.Match object; span=(20, 23), match='987'>
987
type(match1): <class 'callable_iterator'>
<re.Match object; span=(32, 36), match='kobe'>
kobe
<re.Match object; span=(39, 43), match='Kobe'>
Kobe
<re.Match object; span=(63, 67), match='kobe'>
kobe
<re.Match object; span=(101, 105), match='kobe'>
kobe
type(match2): <class 'callable_iterator'>
七、re.split函数
re.split()方法按照匹配的子串将字符串分割后返回一个列表,如无匹配结果,则re.split()函数不会对字符串作出分割
1、语法
re.split(pattern , string , maxsplit = 0 , flags = 0)
2、参数
pattern :匹配的正则表达式,必填参数
string:待匹配字符串,必填参数
maxsplit:分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数,可选参数
endpos:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等,可选参数
# re.split()函数
import re
# \W 匹配非字母、数字、下划线,等价于 '[^A-Za-z0-9_]'
print(re.split('\W+', 'June、0609、June.'))
print(re.split('(\W+)', ' June、0609、June.'))
print(re.split('\W+', 'June、0609、June.', maxsplit = 1))
print(re.split('\W+', 'June、0609、June.', maxsplit = 0))
print(re.split('\d+', 'June Kobe'))
['June', '0609', 'June', '']
['', ' ', 'June', '、', '0609', '、', 'June', '.', '']
['June', '0609、June.']
['June', '0609', 'June', '']
['June Kobe']
八、正则表达式对象
re.RegexObject
re.compile() 返回 RegexObject 对象
re.MatchObject
group() 返回被 RE 匹配的字符串:
1、start() 返回匹配开始的位置
2、end() 返回匹配结束的位置
3、span() 返回一个元组包含匹配 (开始,结束) 的位置
九、正则表达式修饰符 - 可选标志
正则表达式可包含一些可选标志修饰符来控制匹配的模式,修饰符被指定为一个可选的标志,多个标志可以通过按位 OR(|) 它们来指定。常用的修饰符有:
修饰符 | 描述 |
---|---|
re.I | 匹配时大小写不敏感 |
re.L | 本地化识别(locale-aware)匹配 |
re.M | 多行匹配,影响 ^ 和 $ |
re.S | 使 . 匹配包括换行在内的所有字符 |
re.U | 根据Unicode字符集解析字符,该标志影响 \w、 \W、 \b 和 \B |
re.X | 该标志通过给予用户更灵活的格式以便用户将正则表达式写得更易于理解 |
十、正则表达式模式
字母和数字一般表示其自身,一个正则表达式模式中的字母和数字匹配同样的字符串。
当多数字母和数字前加一个反斜杠时会拥有不同的含义。
标点符号只有被转义(前面加“\”)时才匹配自身,否则它们表示特殊的含义。
反斜杠本身需要使用反斜杠转义(“\”)。
一般正则表达式通常都会包含反斜杠,因此最好使用原始字符串来表示它们,即在正则表达式前面加上r,模式元素(如 r’\t’,等价于 \t )匹配相应的特殊字符。
模式 | 描述 |
---|---|
^ | 匹配字符串的开头 |
$ | 匹配字符串的末尾 |
. | 匹配除换行符之外的任意字符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符 |
[…] | 用来表示一组字符,单独列出:[amk] 表示匹配 ‘a’、'm’或’k’ |
[^…] | 不在[]中的字符:[^abc] 表示匹配除了a、b、c之外的字符 |
* | 匹配0个或多个的表达式 |
+ | 匹配1个或多个的表达式 |
? | 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式 |
{n} | 匹配n个前面表达式。例如 “o{2}” 不能匹配"Job"中的"o",但是能匹配"foot"中的两个o |
{n,} | 精确匹配n个前面表达式。例如 “o{2,}” 不能匹配"Job"中的"o",但能匹配"foooood"中的所有o;"o{1,}“等价于"o+”;"o{0,}"则等价于"o"* |
{n , m} | 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式 |
a OR b | 匹配a或b |
(re) | 匹配括号内的表达式,也表示一个组 |
(?imx) | 正则表达式包含三种可选标志:i、m、或 x 。只影响括号中的区域 |
(?-imx) | 正则表达式关闭 i、 m、 或 x 可选标志。只影响括号中的区域 |
(?: re) | 类似 (…), 但是不表示一个组 |
(?imx: re) | 在括号中使用i, m, 或 x 可选标志 |
(?-imx: re) | 在括号中不使用i, m, 或 x 可选标志 |
(?#…) | 注释. |
(?= re) | 前向肯定界定符。如果所含正则表达式,以 … 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边 |
(?! re) | 前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功。 |
(?> re) | 匹配的独立模式,省去回溯 |
\w | 匹配数字字母下划线 |
\W | 匹配非数字字母下划线 |
\s | 匹配任意空白字符,等价于 [\t\n\r\f] |
\S | 匹配任意非空字符 |
\d | 匹配任意数字,等价于 [0-9] |
\D | 匹配任意非数字 |
\A | 匹配字符串开始 |
\Z | 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串 |
\z | 匹配字符串结束 |
\G | 匹配最后匹配完成的位置 |
\b | 匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配"never" 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’ |
\B | 匹配非单词边界。‘er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’ |
\n、 \t ,等 | 匹配一个换行符、制表符,等 |
\1…\9 | 匹配第n个分组的内容 |
\10 | 匹配第n个分组的内容,如果它经匹配,否则指的是八进制字符码的表达式 |
十一、正则表达式实例
字符匹配
实例 | 描述 |
---|---|
Kobe | 匹配“Kobe” |
字符类匹配
实例 | 描述 |
---|---|
[Kk]obe | 匹配 “Kobe” 或 “kobe” |
rub[ye] | 匹配 “ruby” 或 “rube” |
[abcdefg] | 匹配中括号内的任意一个字母 |
[0-9] | 匹配任意数字 |
[a-z] | 匹配任意小写字母 |
[A-Z] | 匹配任意大写字母 |
[a-zA-Z0-9] | 匹配任意字母及数字 |
[^aeiou] | 匹配除aeiou字母之外的所有字符 |
[^0-9] | 匹配除0-9之外的所有字符 |
特殊字符类
字符 | 描述 |
---|---|
. | 匹配除 “\n” 之外的任何单个字符,如要匹配包括 ‘\n’ 在内的任何字符,请使用类似 ‘[.\n]’ 的模式 |
\d | 匹配一个数字字符,等价于 [0-9] |
\D | 匹配一个非数字字符。等价于 [^0-9] |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v] |
\S | 匹配任何非空白字符。等价于 [^ \f\n\r\t\v] |
\w | 匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]' |
\W | 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]' |
十二、正则表达式中括号的使用场景
1、正则表达式中没有括号 – 正常匹配
import re
string="000 111 222 333 444 555 666 777 888 999 000"
regex=re.compile("\w+\s+\w+")
print(regex.findall(string))
['000 111', '222 333', '444 555', '666 777', '888 999']
说明:当正则表达式中没有括号时,就是正常匹配。以上例子中中"/w+/s+/w+“代表要匹配“数字 数字”类型的字符串,第一次匹配到的字符为"000 111”,由于贪婪模式会继续匹配,第二次从"222"开始匹配,匹配到的字符串为"222 333",以此类推
2、正则表达式中有一个括号 – 输出内容仅为括号匹配到的内容
当正则表达式中有一个括号时,其输出的内容仅是括号匹配到的内容,而不是整个表达式所匹配到的结果,但是此时整个正则表达式都被执行了,只不过只输出括号匹配到的内容
import re
string="000 111 222 333 444 555 666 777 888 999 000"
regex=re.compile("(\w+)\s+\w+")
print(regex.findall(string))
['000', '222', '444', '666', '888']
说明:当正则表达式中有一个括号时,其输出的内容仅是括号匹配到的内容,而不是整个表达式所匹配到的结果,但是此时整个正则表达式都被执行了,只不过只输出括号匹配到的内容,在第一次匹配时跟没有括号时一样,匹配到 “000 111” ,只不过只输出(/w+)匹配到的结果,即"000",第二次匹配从"222" 开始,匹配到"222 333",但是还是只是输出"222 ",以此类推
3、正则表达式中有两个括号 – 输出一个list(列表中包含N个 tuple,每个元组包括两个字符串,第一个字符串为最外面括号匹配结果,第二个字符串为最里面括号匹配结果)
import re
string="000 111 222 333 444 555 666 777 888 999 000"
regex=re.compile(r"((\w+)\s+\w+)")
print(regex.findall(string))
[('000 111', '000'), ('222 333', '222'), ('444 555', '444'), ('666 777', '666'), ('888 999', '888')]
说明:输出结果为一个list,列表中包含五个元组,每一个元组中有两个字符串,第一个字符串"000 111"是最外面的括号输出的结果,第二个是最里面括号(/w+)输出的结果 “000”, 第二个字符串"222 333"是最外面的括号输出的结果,第二个是最里面括号(/w+)输出的结果 “222”, 以此类推
4、正则表达式中有M个括号 – 输出一个list(列表中包含N个 tuple,每个元组包括M个字符串,第一个字符串为最外面括号匹配结果,第二个字符串为里面第二个括号匹配结果,以此类推)
import re
string = "000 111 222 333 444 555 666 777 888 999 000"
pattern = re.compile(r'((?P<here>[0-9]+)(\s+)([0-9]+))', re.I)
match = pattern.findall(string)
print(match)
[('000 111', '000', ' ', '111'), ('222 333', '222', ' ', '333'), ('444 555', '444', ' ', '555'), ('666 777', '666', ' ', '777'), ('888 999', '888', ' ', '999')]
说明:输出结果为一个list,列表中包含五个元组,每一个元组中有四个字符串,第一个字符串"000 111"是最外面的括号输出的结果,第二个字符串“000”是里面第一个括号(?P[0-9]+)输出的结果, 第三个字符串空格" "是里面第二个括号(\s+)输出的结果,第四个字符串"111"是里面第三个括号([0-9]+)输出的结果;第二个元组中的数据以此类推