Regex 正则表达式入门

微信公众号:码农充电站pro
个人主页:https://codeshellme.github.io
0,什么是正则表达式
正则表达式(Regular Expression简写为Regex),又称为规则表达式,它是一种强大的文本匹配模式,其用于在字符串中查找匹配符合特定规则的子串。
正则表达式是独立于编程语言而存在的,它并不依赖于某种编程语言。只要一种编程语言实现了正则表达式引擎,那么这种编程语言,就具备了正则表达式模式匹配的功能。每种工具或编程语言对正则表达式的实现,虽有细节上的不同,但基本的使用是相同的。
正则表达式的基本工作原理如下:

1,正则表达式的由来
1956 年,美国数学家Stephen Kleene 在两位神经生理学家(Warren McCulloch 和 Walter Pitts)的早期工作的基础上,发表了一篇标题为神经网事件的表示法的论文,由此引入了正则表达式的概念。
之后,Unix 之父Ken Thompson把这一成果应用于计算搜索算法的一些早期研究。随后,他将这一符号系统应用于Unix 系统中的 qed 编辑器,这是正则表达式的第一个实用程序。
此后,正则表达式被广泛的应用于类Unix 系统的工具中,如 grep,perl 等。
2,正则表达式工具
RegexBuddy 是一个很不错的软件。
Regexr 是一个在线工具。
3,正则表达式语法
正则表达式由一些普通字符(比如英文字母,数字)和元字符(代表特定含义)组成。
正则表达式作为一个字符模板,在字符串中匹配一个或多个符合特定规则的子串。
3.1,元字符
元字符就是包含特定含义的字符。如果想匹配这些元字符,需要使用转义字符\ 进行转义。
下表是一些常用的元字符:
| 字符 | 含义 |
|---|---|
\ |
转义字符,常用于转义元字符 |
. |
匹配除换行符\n 之外的任何单字符 |
$ |
匹配字符串的结尾位置 |
^ |
匹配字符串的开始位置。当写在中括号[]内时,表示不匹配该中括号中的字符集合 |
[^xy] |
匹配非x,非y字符 |
() |
被小括号包含的多个字符,将作为一整个字符 |
(pattern) |
写在小括号()内的表达式,表示一个分组,用于提取内容 |
(?:pattern) |
只表示一个分组,不提取内容 |
[] |
被中括号包含的多个字符,这多个字符的关系是逻辑或的关系 |
[xyz] |
字符集合,匹配x或y或z |
[0-9] |
匹配0到9之间的数字 |
[a-z] |
匹配a到z之间的字符 |
[^a-z] |
匹配不在a到z范围内的任意字符 |
| |
写在两个字符之间,代表逻辑或的关系 |
x|y |
匹配x 或 y |
\b |
匹配一个单词边界 |
\B |
匹配非单词边界 |
\d |
匹配一个数字字符,等价于[0-9] |
\D |
匹配一个非数字字符,等价于[^0-9] |
\s |
匹配任何空白字符,包括空格、制表符等 |
\S |
匹配任何非空白字符 |
\w |
匹配字母、数字、下划线,等价于[A-Za-z0-9_] |
\W |
匹配非字母、非数字、非下划线,等价于[^A-Za-z0-9_] |
\f |
匹配换页符 |
\n |
匹配换行符 |
\r |
匹配回车符 |
\t |
匹配制表符 |
\v |
匹配垂直制表符 |
3.2,限定符
限定符也属于元字符,用来限定一个子表达式出现的次数。
| 字符 | 含义 |
|---|---|
* |
匹配前面的子表达式零次或多次 |
+ |
匹配前面的子表达式一次或多次 |
? |
匹配前面的子表达式零次或一次 |
{n} |
匹配前面的子表达式n次 |
{n,} |
匹配前面的子表达式至少n次 |
{n,m} |
匹配前面的子表达式n 到m 次 |
4,正则表达式示例
我们逐个介绍一下每种元字符的使用方式,下面的例子我们都使用RegexBuddy 软件来演示。
4.1,转义字符\
转义字符用来对一些元字符进行转义,使这些元字符失去其特定的含义,只表示一个普通的字符。
比如我们想匹配字符串aaa^bbb 中的a^b 子串,我们需要用模式a\^b 来匹配,^ 之前需要加一个转义字符\。

4.2,元字符.
元字符. 可匹配任意(除了换行符\n)的单字符,意思就是. 可以代表任意(除了换行符\n)的单字符。

4.3,开始位置^与结束位置$
符号^ 表示匹配的子串在行首,符号$ 表示匹配的子串在行尾。
匹配行首

匹配行尾

行首行尾

4.4,逻辑或|
符号| 写在两个子表达式之间表示逻辑或的意思。
例如模式串ab|cd,匹配ab 或 cd。

4.5,限定符
限定符用于限定一个子表达式出现的次数,一共6 种,这里给出一些示例。
符号*
模式串ab*c,表示字符a和c 之间需要出现0 次或多次字符b。

符号+
模式串ab+c,表示字符a和c 之间需要出现1 次或多次字符b,即至少出现1次字符b。

符号?
模式串ab?c,表示字符a和c 之间需要出现0 次或1次字符b。

符号{n}和{n,}和{n,m}
ab{3}c:符号b 出现的次数必须是3ab{3,}c:符号b 出现的次数必须大于等于3ab{3,5}c:符号b 出现的次数必须在3和5之间,包括3和5

4.6,字符簇[]
写在中括号[] 内的多个字符代表逻辑或的意思。
模式串a[bef]c,表示a和c中间的字符必须是b或e或f。

当符号^ 写在中括号[] 内时,表示逻辑非的意思。
模式串a[^bef]c,表示a和c中间的字符不能是b或e或f。

符号- 写在中括号[],表示范围的意思:
| 示例 | 含义 |
|---|---|
[a-z] |
表示a 到z 之间的任意字符 |
[A-Z] |
表示A 到Z 之间的任意字符 |
[0-9] |
表示0 到9 之间的任意数字,含义同\d |
[^0-9] |
表示任意非数字,含义同\D |
[A-Za-z0-9_] |
表示任意字母,数字或下划线 ,含义同\w |
[^A-Za-z0-9_] |
表示任意非字母,非数字,非下划线 ,含义同\W |
[ \f\r\t\n] |
表示任意的空白字符,含义同\s |
[^ \f\r\t\n] |
表示任意的非空白字符,含义同\S |
4.7,字符组合()
写在小括号()中的多个字符,会被看成一个整体。

4.8,单词边界\b与\B
符号\b 是指一个单词边界,比如空白字符和标点符号等。
符号\B 表示非单词边界。

5,贪婪与非贪婪模式
正则表达式中贪婪的意思就是贪多,意思就是正则在匹配的过程中,总是去匹配尽可能多的字符,符号? 可以将贪婪转换为非贪婪。

6,在Python 中使用正则
Python 中提供了re 模块,用于支持正则表达式功能。
在python 中一般在表达式前加r,表示原始字符,不用考虑转义的问题。例如r'abc'。
下面打开python 终端:
- 首先引入模块,
import re help(re)可查看re 模块帮助手册dir(re)可查看其支持的属性和方法
>>> python `打开python 终端`
_____________________________________________
Python 2.7.17 (default, Nov 7 2019, 10:07:09)
[GCC 7.4.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import re # 引入re 模块
>>>
>>> help(re) # 查看帮助手册
>>>
>>> dir(re) # 查看re 支持的属性和方法
6.1,re 模块常用方法
| 方法 | 含义 |
|---|---|
match |
用于匹配表达式 |
search |
查找匹配项 |
findall |
查找所有的匹配项 |
compile |
编译正则表达式 |
详细解释:
match(pattern, string, flags=0)
Try to apply the pattern at the start of the string, returning
a match object, or None if no match was found.
search(pattern, string, flags=0)
Scan through string looking for a match to the pattern, returning
a match object, or None if no match was found.
findall(pattern, string, flags=0)
Return a list of all non-overlapping matches in the string.
If one or more groups are present in the pattern, return a
list of groups; this will be a list of tuples if the pattern
has more than one group.
Empty matches are included in the result.
compile(pattern, flags=0)
Compile a regular expression pattern, returning a pattern object.
可以看到,每个方法中都有一个flag 参数,它表示匹配模式,默认值为0,表示普通模式。
flag 参数的值有以下几种选择,可以使用符号| 连接多种选择:
`I/IGNORECASE` Perform case-insensitive matching.
`L/LOCALE` Make \w, \W, \b, \B, dependent on the current locale.
`M/MULTILINE` "^" matches the beginning of lines (after a newline)
as well as the string.
"$" matches the end of lines (before a newline) as well
as the end of the string.
`S/DOTALL` "." matches any character at all, including the newline.
`X/VERBOSE` Ignore whitespace and comments for nicer looking RE's.
`U/UNICODE` Make \w, \W, \b, \B, dependent on the Unicode locale.
6.2,match 方法
re.match 尝试从字符串的起始位置开始匹配:
- 成功:返回
SRE_Match对象 - 失败:返回
None
>>> m = re.match(r'abc', 'abcde')
>>> print m # 匹配成功
<_sre.SRE_Match object at 0x7f91544cff80>
>>>
>>>
>>> m = re.match(r'abc', 'fabcde')
>>> print m # `fabcde` 不是以`abc` 开头,匹配失败
None
>>>
6.3,search 方法
re.search 扫描整个字符串,直到找到第一个成功的匹配:
- 成功:返回
SRE_Match对象 - 失败:返回
None
>>> m = re.search(r'abc', 'abcde')
>>> print m # 匹配成功
<_sre.SRE_Match object at 0x7f91544cff80>
>>>
>>> m = re.search(r'abc', 'fabcde')
>>> print m # 匹配成功
<_sre.SRE_Match object at 0x7f9154521b90>
6.4,findall 方法
re.findall 在字符串中查找所有匹配的子串:
- 成功:返回一个列表
- 失败:返回
空列表[]
>>> re.findall(r'abc', 'fabcdeabc')
['abc', 'abc'] # 找到两个`abc` 子串
>>>
>>> re.findall(r'abce', 'fabcdeabc')
[] # 没找到子串
>>>
6.5,compile 方法
在使用正则时,re 模块会先将正则表达式进行编译,然后才会去字符串中匹配。
如果一个正则表达式会使用很多次,我们可以使用re.compile 方法对表达式进行预编译,这样就不会在每次用到这个表达式时都进行编译,有助于提高效率。
该方法返回一个SRE_Pattern 对象,该对象又包含match,search,findall 等方法,使用方法如下:
>>> reg = re.compile(r'abc') # 编译
>>>
>>> type(reg)
<type '_sre.SRE_Pattern'>
>>>
>>> reg.findall('fabcdeabc') # 找到两个
['abc', 'abc']
>>>
>>> reg.match('fabcdeabc') # 没有匹配上
>>>
>>> reg.search('fabcdeabc') # 匹配上
<_sre.SRE_Match object at 0x7f9154521b90>
6.6,SRE_Match 对象
SRE_Match 对象用于获取分组,写在小括号()内的表达式是一个分组。
>>> # 正则中包含两个分组
>>> m = re.match(r'(\d*)-(\w*)', '123-abc-')
>>> m
<_sre.SRE_Match object at 0x7f91544e0ae0>
>>> m.group(0) # 获取整个匹配的串,同 m.group()
'123-abc'
>>> m.group(1) # 获取第一个分组
'123'
>>> m.group(2) # 获取第二个分组
'abc'
>>>
6.7,match,search,findall 比较
我们来看下match,search,findall 三个方法的异同点:
- match:必须从字符串的开头匹配,只会有一个匹配项,返回结果是
SRE_Match对象 - search:扫描整个字符串,直到匹配到第一个为止,只会有一个匹配项,返回结果是
SRE_Match对象 - findall:扫描整个字符串,返回所有的匹配项,返回结果是一个字符串列表
(完。)
欢迎关注作者公众号,获取更过技术干货。

Regex 正则表达式入门的更多相关文章
- Python 正则表达式入门(初级篇)
Python 正则表达式入门(初级篇) 本文主要为没有使用正则表达式经验的新手入门所写. 转载请写明出处 引子 首先说 正则表达式是什么? 正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达 ...
- 转载 Python 正则表达式入门(初级篇)
Python 正则表达式入门(初级篇) 本文主要为没有使用正则表达式经验的新手入门所写.转载请写明出处 引子 首先说 正则表达式是什么? 正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达式 ...
- 正则表达式入门之学习路线&七个问题
由于工作需求,需要使用正则表达式查找满足某种模式的字符串,但因为之前都没有接触过相关内容,最开始的时候看了一些已经被别人写好了的正则表达式,本来打算可能可以直接使用: 最全的常用正则表达式大全——包括 ...
- python正则表达式入门篇
文章来源于:https://www.cnblogs.com/chuxiuhong/p/5885073.html Python 正则表达式入门(初级篇) 本文主要为没有使用正则表达式经验的新手入门所写. ...
- Java正则表达式入门基础篇
正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符(元字符)组成的文字模式,它 用以描述在查找文字主体时待匹配的一个或多个字符串.正则表达式作为 ...
- Python 正则表达式入门(中级篇)
Python 正则表达式入门(中级篇) 初级篇链接:http://www.cnblogs.com/chuxiuhong/p/5885073.html 上一篇我们说在这一篇里,我们会介绍子表达式,向前向 ...
- 分享录制的正则表达式入门、高阶以及使用 .NET 实现网络爬虫视频教程
我发布的「正则表达式入门以及高阶教程」,欢迎学习. 课程简介 正则表达式是软件开发必须掌握的一门语言,掌握后才能很好地理解到它的威力: 课程采用概念和实验操作 4/6 分隔,帮助大家理解概念后再使用大 ...
- JavaScript正则表达式详解(一)正则表达式入门
JavaScript正则表达式是很多JavaScript开发人员比较头疼的事情,也很多人不愿意学习,只是必要的时候上网查一下就可以啦~本文中详细的把JavaScript正则表达式的用法进行了列表,希望 ...
- 转:C++ Boost/tr1 Regex(正则表达式)快速指南
C++ Boost/tr1 Regex(正则表达式)快速指南 正则表达式自Boost 1.18推出,目前已经成为C++11(tr1)的标准部分. 本文以Boost 1.39正则表达式为基础,应该广泛适 ...
随机推荐
- 计算机网络-CSMA/CD
假定1km长的CSMA/CD网络的传输速率为1Gbit/s.设信号在网络上的传播速率为200000km/s,则能够使用此协议的最短帧长是? 答案:2×104bit/s 解析:C=2×105km/s,即 ...
- mysql 主键和默认 设为索引的规则
一.mysql 表中如果是单主键的话,那这个主键也会被 系统默认建为 索引 二.mysql 表中如果是复合主键的话,那系统会遵循左对齐原则,即如复合主键 a 和 b字段和c字段..., 默认建的主键索 ...
- 使用Jmeter测试java请求
1.性能测试过程中,有时候开发想对JAVA代码进行性能测试,Jmeter是支持对Java请求进行性能测试,但是需要自己开发.打包好要测试的代码,就能在Java请求中对该java方法进行性能测试2.本文 ...
- Git应用详解第九讲:Git cherry-pick与Git rebase
前言 前情提要:Git应用详解第八讲:Git标签.别名与Git gc 这一节主要介绍git cherry-pick与git rebase的原理及使用. 一.Git cherry-pick Git ch ...
- Jmeter命令行执行并生成HTML报告
前提:准备好jmeter脚本,找到jmeter配置文件查看生成的日志格式是否为csv,如果不是请改为csv 注意:使用命令执行jmeter脚本必须使用jmeter 3.0及以上版本1.使用命令行执行脚 ...
- 你知道python入门,是学到什么程度才算是吗?
1.入门的标准是什么? 这是很多初学者都关注的问题,但又是一个很难回答的问题,问题的核心是采取什么标准来衡量一个人是否已经入门. 以知识量的多少来衡量是不是可行呢?有些人走马观花一般学了很多pytho ...
- pickle\json,configparser,hashlib模块
python常用模块 目录 python常用模块 json模块\pickle模块 configparser模块 hashlib模块 subprocess模块 json模块\pickle模块 首先说一下 ...
- Jmeter发送jdbc请求进行大批量造数
创建批量造数脚本,一个简单的结构如下图所示, 1.线程组(10个线程重复运行2次,相当于造20个数) 2.用户定义变量(这是全局变量,用于后面随机筛选用) 3.数据库连接配置 4.计数器(用于主键递增 ...
- Crossing River POJ过河问题
A group of N people wishes to go across a river with only one boat, which can at most carry two pers ...
- [Abp vNext 入坑分享] - 1.创建初始的项目
一.简要说明 本篇文章主要是跟着官方的文档把项目安装好先,同时了解一下大概的项目结构. 二.具体步骤 2.1全局安装ABP CLI,直接在cmd中安装即可.如果你之前安装过,这里可以略过: dotne ...