欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

[Python]正则表达式 re模块案例

程序员文章站 2022-03-14 21:23:16
re模块案例>>> import re #导入re模块>>> text = 'alpha. beta....gamma delta' #测试用的字符串>>> re.split('[\. ]+', text) #使用指定字符作为分隔符进行分隔['alpha', 'beta', 'gamma', 'delta']>>> re.split('[\. ]+', text, maxsplit=2) #最多分隔2次['alpha', '...

re模块案例

>>> import re #导入re模块
>>> text = 'alpha. beta....gamma delta' #测试用的字符串
>>> re.split('[\. ]+', text) #使用指定字符作为分隔符进行分隔
['alpha', 'beta', 'gamma', 'delta']
>>> re.split('[\. ]+', text, maxsplit=2) #最多分隔2次
['alpha', 'beta', 'gamma delta']
>>> re.split('[\. ]+', text, maxsplit=1) #最多分隔1次
['alpha', 'beta....gamma delta']
>>> pat = '[a-zA-Z]+'
>>> re.findall(pat, text) #查找所有单词
['alpha', 'beta', 'gamma', 'delta']
>>> pat = '{name}'
>>> text = 'Dear {name}...'
>>> re.sub(pat, 'Mr.Dong', text) #字符串替换
'Dear Mr.Dong...'
>>> s = 'a s d'
>>> re.sub('a|s|d', 'good', s) #字符串替换
'good good good'
>>> s = "It's a very good good idea"
>>> re.sub(r'(\b\w+) \1', r'\1', s) #处理连续的重复单词
"It's a very good idea"
>>> re.sub(r'((\w+) )\1', r'\2', s)
"It's a very goodidea"
>>> re.sub('a', lambda x:x.group(0).upper(), 'aaa abc abde') #repl为可调用对象
'AAA Abc Abde'
>>> re.sub('[a-z]', lambda x:x.group(0).upper(), 'aaa abc abde')
'AAA ABC ABDE'
>>> re.sub('[a-zA-z]', lambda x:chr(ord(x.group(0))^32), 'aaa aBc abde') #英文字母大小写互换
'AAA AbC ABDE'
>>> re.subn('a', 'dfg', 'aaa abc abde') #返回新字符串和替换次数
('dfgdfgdfg dfgbc dfgbde', 5)
>>> re.sub('a', 'dfg', 'aaa abc abde')
'dfgdfgdfg dfgbc dfgbde'
>>> re.escape('http://www.python.org') #字符串转义
'http\\:\\/\\/www\\.python\\.org'
>>> print(re.match('done|quit', 'done')) #匹配成功,返回match对象
<_sre.SRE_Match object at 0x00B121A8>
>>> print(re.match('done|quit', 'done!')) #匹配成功
<_sre.SRE_Match object at 0x00B121A8>
>>> print(re.match('done|quit', 'doe!')) #匹配不成功,返回空值None
None
>>> print(re.match('done|quit', 'd!one!')) #匹配不成功
None
>>> print(re.search('done|quit', 'd!one!done')) #匹配成功
<_sre.SRE_Match object at 0x0000000002D03D98>

下面的代码使用不同的方法删除字符串中多余的空格,如果遇到连续多个空格则只保留一个,同时删除字符串两侧的所有空白字符。

>>> import re
>>> s = 'aaa      bb      c d e   fff    '
>>> ' '.join(s.split()) #直接使用字符串对象的方法
'aaa bb c d e fff'
>>> ' '.join(re.split('[\s]+', s.strip())) #同时使用re中的函数和字符串对象的方法
'aaa bb c d e fff'
>>> ' '.join(re.split('\s+', s.strip())) #与上一行代码等价
'aaa bb c d e fff'
>>> re.sub('\s+', ' ', s.strip()) #直接使用re模块的字符串替换方法
'aaa bb c d e fff'

下面的代码使用以“\”开头的元字符来实现字符串的特定搜索。

>>> import re
>>> example = 'Beautiful is better than ugly.'>>> re.findall('\\bb.+?\\b', example) #以字母b开头的完整单词
#此处问号?表示非贪心模式
['better']
>>> re.findall('\\bb.+\\b', example) #贪心模式的匹配结果
['better than ugly']
>>> re.findall('\\bb\w*\\b', example)
['better']
>>> re.findall('\\Bh.+?\\b', example)  #不以h开头且含有h字母的单词剩余部分['han']
>>> re.findall('\\b\w.+?\\b', example) #所有单词
['Beautiful', 'is', 'better', 'than', 'ugly']
>>> re.findall('\w+', example) #所有单词
['Beautiful', 'is', 'better', 'than', 'ugly']
>>> re.findall(r'\b\w.+?\b', example) #使用原始字符串
['Beautiful', 'is', 'better', 'than', 'ugly']
>>> re.split('\s', example) #使用任何空白字符分隔字符串
['Beautiful', 'is', 'better', 'than', 'ugly.']
>>> re.findall('\d+\.\d+\.\d+', 'Python 2.7.13') #查找并返回x.x.x形式的数字
['2.7.13']
>>> re.findall('\d+\.\d+\.\d+', 'Python 2.7.13,Python 3.6.0')
['2.7.13', '3.6.0']
>>> s = '<html><head>This is head.</head><body>This is body.</body></html>'
>>> pattern = r'<html><head>(.+)</head><body>(.+)</body></html>'
>>> result = re.search(pattern, s)
>>> result.group(1) #第一个子模式
>'This is head.'
>>>> result.group(2) #第二个子模式

正则表达式对象的match方法和search方法匹配成功后返回match对象。match对象的主要方法有:

  • group():返回匹配的一个或多个子模式内容
  • groups():返回一个包含匹配的所有子模式内容的元组
  • groupdict():返回包含匹配的所有命名子模式内容的字典
  • start():返回指定子模式内容的起始位置
  • end():返回指定子模式内容的结束位置的前一个位置
  • span():返回一个包含指定子模式内容起始位置和结束位置前一个位置的元组。
>>> m = re.match(r"(\w+) (\w+)", "Isaac Newton, physicist")
>>> m.group(0) #返回整个模式内容
'Isaac Newton'
>>> m.group(1) #返回第1个子模式内容
'Isaac'
>>> m.group(2) #返回第2个子模式内容
'Newton'
>>> m.group(1, 2) #返回指定的多个子模式内容
('Isaac', 'Newton')
>>> m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Malcolm Reynolds")
>>> m.group('first_name') #使用命名的子模式
'Malcolm'
>>> m.group('last_name')
'Reynolds'
>>> m = re.match(r"(\d+)\.(\d+)", "24.1632")
>>> m.groups() #返回所有匹配的子模式(不包括第0个)
('24', '1632')
>>> m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Malcolm Reynolds")
>>>> m.groupdict() #以字典形式返回匹配的结果
>>> s = 'aabc abcd abbcd abccd abcdd'
>>> re.findall(r'(\b\w*(?P<f>\w+)(?P=f)\w*\b)', s)
[('aabc', 'a'), ('abbcd', 'b'), ('abccd', 'c'), ('abcdd', 'd')]

[Python]正则表达式.
[Python]正则表达式 re模块1.
[Python]正则表达式 re模块2.
[Python]正则表达式 贪婪vs非贪婪.
[Python]正则表达式集锦.
[Python]正则表达式 案例.

本文地址:https://blog.csdn.net/chao0401/article/details/110293566