本系列BLOG为鄙人学习python时的学习笔记。
文章目录
- 元字符使用
- 普通字符
- 或关系ß(从此知识点开始就是特殊字符了)
- 匹配单个字符
- 匹配字符集
- 匹配字符集反集
- 匹配字符串开始位置
- 匹配字符串的结束位置
- 匹配字符重复
- *
- +
- ?
- {n}
- {m,n}
- 匹配任意(非)数字字符
- 匹配任意(非)普通字符
- 匹配任意(非)空字符
- 匹配开头结尾位置
- 匹配(非)单词的边界位置
元字符使用
备注:个别编程语言对元字符的支持略有不同,比如某些元字符在个别编程语言中可能不支持。
普通字符
匹配规则:每个普通字符匹配其对应的字符
例子1
In : re.findall('ab',"abcdefabcd")Out: ['ab', 'ab']
注意!正则表达式在python中也可以匹配中文
例子2(支持UTF-8编码格式的匹配)
In :re.findall('小黄', "小黄和大白")Out: ['小黄']
或关系ß(从此知识点开始就是特殊字符了)
元字符: |
匹配规则: 匹配 | 两侧任意的正则表达式即可
例子1
In : re.findall('com|cn',"www.baidu.com/www.tmooc.cn")Out: ['com', 'cn']
匹配单个字符
元字符: .
匹配规则:匹配除换行外的任意一个字符
例子1
In : re.findall('小.兔',"小黄兔,大白兔,小兔")Out: ['小黄兔']
匹配字符集
元字符: [字符集]
匹配规则: 匹配字符集中的任意一个字符
表达形式:
[abc#!好]#表示 [] 中的任意一个字符
[0-9],[a-z],[A-Z]
#表示区间(0-9或a-z或A-Z)内的任意一个字符
[_#?0-9a-z]
#混合书写,一般区间表达写在单个字符后面
例子1
In : re.findall('[aeiou]',"How are you!")Out: ['o', 'a', 'e', 'o', 'u']
例子2
re.findall('[-0-9]', "hello A-007")['-', '0', '0', '7']
匹配字符集反集
元字符:[^字符集]
匹配规则:匹配除了字符集以外的任意一个字符
例子1
In : re.findall('[^0-9]',"Use 007 port")Out: ['U', 's', 'e', ' ', ' ', 'p', 'o', 'r', 't']
例子2
re.findall('[^-a-z ]', "hello A-007")['A', '0', '0', '7']
匹配字符串开始位置
元字符: ^
备注:这里的元字符和匹配字符集反集的元字符,虽然符号相同,但在正则表达式中的位置(该元字符必然放在最开头)和所表达的含义都不同.
匹配规则:匹配目标字符串的开头位置
例子1
In : re.findall('Jame',"hello, Jame")Out: ['Jame']
In : re.findall('^Jame',"hello, Jame")
Out: []
In : re.findall('^Jame',"Jame,hello")
Out: ['Jame']
匹配字符串的结束位置
元字符: $
匹配规则: 匹配目标字符串的结尾位置
规则技巧: ^ 和 $必然出现在正则表达式的开头和结尾处。如果两者同时出现,则中间的部分必须匹配整个目标字符串的全部内容。
例子1
In : re.findall('Jame$',"Hi,Jame")Out: ['Jame']
例子2
In :re.findall('Jame$',"Jame,Hi")Out: []
In :re.findall('^Hi~Jame$',"Hi~Jame")
Out: ['Hi~Jame']
匹配字符重复
*
元字符: *
匹配规则:匹配前面的字符出现0次或多次
例子1
In : re.findall('wo*',"wooooo~~w!")Out: ['wooooo', 'w']
例子2
In : print(re.findall('[A-Z][a-z]*',"Hello World, Hi Huang"))
Out: ['Hello', 'World', 'Hi', 'Huang']
+
元字符:+
匹配规则: 匹配前面的字符出现1次或多次
例子1
In : re.findall('[A-Z][a-z]+',"Hello World")Out: ['Hello', 'World']
例子2
In :print(re.findall('[A-Z][a-z]*',"Hello World, A B C"))
Out: ['Hello', 'World', 'A', 'B', 'C']
In : print(re.findall('[A-Z][a-z]+',
"Hello World, A B C"))
Out: ['Hello', 'World']
?
元字符:?
匹配规则: 匹配前面的字符出现0次或1次
例子1(匹配整数)
In [28]: re.findall('-?[0-9]+',"Jame,age:18, -26")Out[28]: ['18', '-26']
{n}
元字符:{n}
匹配规则: 匹配前面的字符出现n次
例子1(匹配手机号码)
In : re.findall('1[0-9]{10}',"Jame:13886495728")Out: ['13886495728']
{m,n}
元字符:{m,n}
匹配规则: 匹配前面的字符出现m-n次
例子1(匹配QQ号)
In : re.findall('[1-9][0-9]{5,10}',"Baron:1259296994")Out: ['1259296994']
匹配任意(非)数字字符
元字符: \d \D
匹配规则:\d 匹配任意数字(整数、小数、正数、负数)字符,\D 匹配任意非数字字符
例子1(匹配端口)
In : re.findall(\d{1,5}',"Mysql: 3306, http:80")Out: ['3306', '80']
例子2
In :data = '''雨量是用雨量器和雨量杯来计算的,雨量器是个圆柱形的开口筒,
筒口面积在我国多为314平方厘米(直径20厘米)。
为了防止降水蒸发,中上部呈一漏洞型,下部放一储水瓶。
为观测方便与上述口径配套有一特制量杯,雨量杯的口径为4厘米,
因此每一毫米降水量在雨量杯上的长度为25毫米。为了连续记录液态降水量,
水文气象部门多使用虹吸式雨量计或翻斗式遥测雨量计。它们的记录纸,不但记录了总降水量,
还可以判定不同时段的降水量或降水强度。以在平面收集到的雨水深度表示,
准确程度至0.25毫米或0.01寸。有时亦会以升每平方米 (1 L m-2 = 1 mm)表示。
在气象统计名词上,雨量又可称为降雨量,即一定时间内之降水累积量,
其中,若降水量若小於0.1公厘视为雨迹。
'''
In : print(re.findall('-?\d+\.?\d*', data))
Out: ['314', '20', '4', '25', '0.25', '0.01', '1', '-2', '1', '0.1']
匹配任意(非)普通字符
元字符: \w \W
匹配规则: \w 匹配普通字符,\W 匹配非普通字符
说明: 普通字符指数字、字母、下划线、汉字。
例子1
In : re.findall('\w+',"server_port = 8888")Out: ['server_port', '8888']
例子2
In :re.findall('\W+',"server_port = 8888")Out: [' = ']
匹配任意(非)空字符
元字符: \s \S
匹配规则: \s 匹配空字符,\S 匹配非空字符
说明:空字符指空格、\r 、\n 、\t 、\v 、\f 字符
例子1
In : re.findall('\w+\s+\w+',"hello world")Out: ['hello world']
例子2
In :print(re.findall('\S+', "TUTU-12~#: fhgj"))Out: ['TUTU-12~#:', 'fhgj']
匹配开头结尾位置
元字符: \A \Z
匹配规则: \A 表示开头位置(^),\Z 表示结尾位置($)
匹配(非)单词的边界位置
元字符: \b \B
匹配规则: \b 表示单词边界,\B 表示非单词边界
说明:单词边界指数字、字母(汉字)、下划线[这些其实就是\w]与其他字符的交界位置。
例子1
In : print(re.findall('is', "This is XiaoHuang"))Out: ['is', 'is']
In : print(re.findall(r'\bis\b', "This is XiaoHuang"))
#这里的python字符串'\bis\b'前要加r
Out: ['is']
#这里输出的is,是第二个is(两边都有空格的is)
备注:为啥这里的python字符串前要加r,我们之后(下一个blog)再解释
例子2
In : print(re.findall(r'\Bis\b', "This is XiaoHuang"))Out: ['is']
#这里输出的is,是第一个is(只有右边都有空格的is)
例子3(匹配大写字母开头的单词)
In :print(re.findall(r'\b[A-Z]\w+',"This is iPython"))
Out: ['This']