正则表达式介绍及Python使用方法

正则表达式(Regular expression)是组成搜索模式的一组字符序列,是记录文本规则的代码,用来检查文本中是否包含指定模式的字符串,通过定义一个规则来匹配字符串。正则表达式广泛应用于在字符串查找和处理中,大多文本编辑器基本都支持正则表达式查找。本文将简要介绍正则表达式语法,然后介绍Python语言中正则表达式使用方法。

正则表达式

Unix之父Ken Tompson将正则表达式引入Unix,后面发展成了grep(Global Regular Expression Print)命令,由于grep不支持+|? ,且分组比较麻烦,AT&T的Alfred Aho开发了egrep命令。随着Unix的版本不断演化,Unix中的程序(比如Linux三剑客中的awk、sed)所支持的正则表达式有差异,比较混乱。在1986年制定了POSIX(Portable Operating System Interface)标准,其中统一了正则表达式的语法。

POSIX标准把正则表达式分为两种:BRE(Basic Regular Expressions)和ERE(Extended Regular Expressions )。BRE就是unix系统使用的grep命令,ERE对应egrep命令,是BRE的扩展。而linux系统使用的是GNU标准,linux发行版集成了GNU(Gnu’s Not Unix)套件,GNU在实现了POXIS标准的同时,做了一定的扩展。也包括GNU Basic Regular Expressions 和GNU Extends Regular Expressions。

正则表达式除了POSIX标准之外还有一个Perl分支,Perl与sed和awk兼容,后来演化成为PCRE(Perl Compatible Regular Expressions),是一个用C语言编写的正则表达式函数库,功能很强大,性能比POSIX正则表达式好。PCRE被引入了其他语言中,比如PHP, Tcl, Python, Ruby, C++, Java, R语言等等。

普通正则

代码说明
.匹配除换行符以外的任意字符
\w匹配字母或数字或下划线或汉字
\s匹配任意的空白符
\d匹配数字
\b匹配单词的开始或结束
^匹配字符串的开始
$匹配字符串的结束
*重复零次或更多次

扩展正则

扩展正则:grep加 -E 参数

  • grep -E ’ 404 | 500’ nginx.log
代码/语法说明
+重复一次或更多次
重复零次或一次
{n}重复n次
{n,}重复n次或更多次
{n,m}重复n到m次
|表示或

零宽断言

语法说明
(?=exp)匹配exp前面的位置
(?<=exp)匹配exp后面的位置
(?!exp)匹配后面不是exp的位置
(?<!exp)匹配前面不是exp的位置

正则表达式相关工具

正则表达式功能强大,但很难熟练掌握,这里介绍一些学习和搜索正则表达式的工具。

正则表达式在线测试工具:

  1. https://regex101.com/
  2. http://c.runoob.com/front-end/854
  3. https://tool.oschina.net/regex
  4. http://tool.rbtree.cn/regtool/

正则表达式搜索:

  1. https://ihateregex.io/expr/ : 提供了一些常用的正则表达式写法,此外列出了使用到的正则语法。

正则表达式实例

测试文本test.txt

$ cat test.txt
abc
bac
123456
bc
test123
12345678901234
023-12345678
123
GET 1
GET123
GET
test123test

1. 匹配以字母a开头的单词

$ grep '\ba\w*\b' test.txt
abc

2. 匹配刚好6个字符的单词

$ grep -E '\b\w{6}\b' test.txt
123456
GET123

3. 匹配1个或更多连续的数字

$ grep -Po '\d+' test.txt
123456
123
12345678901234
023
12345678
123
1
123
123

4. 5位到12位QQ号

$ grep -P '\d{5,12}' test.txt
123456
12345678901234
023-12345678

$ grep -P '^\d{5,12}$' test.txt
123456

5. 匹配电话号码

$ grep -P '0\d{2}-\d{8}' test.txt
023-12345678

6. 只匹配3位数字

$ grep -P '^\d{3}$' test.txt
123

7. 查找单词‘GET’

$ grep '\bGET\b' test.txt
GET 1
GET
$ grep '^GET$' test.txt
GET

8. 匹配两个字符之间的内容

$ grep -Eo "test(.+?)test" test.txt
test123test
$ grep -Po "(?<=test).*?(?=test)" test.txt
123

9. .*.+的使用方法

$ text1="fn()"
$ text2="fn(6)"
$ echo $text1 | grep "fn\(.*\)"
fn()
$ echo $text2 | grep "fn\(.*\)"
fn(6)
$ echo $text1 | grep -E "fn\(.+\)"

$ echo $text2 | grep -E "fn\(.+\)"
fn(6)

Python正则表达式

Python有一个内置正则表达式模块 re ,可以使用它来进行字符串操作:

import re

re模块提供了以下4种方法:

  • findall:返回所有匹配项
  • search:如果匹配到目标字符,返回一个匹配对象,用于判断是否存在目标字符串
  • split:分割
  • sub:替换

匹配数字、字母

text = '1&\nbsp;hour(s) 2&\nbsp;min 25&\nbsp;s'
re.findall(r'\d+',text) # 匹配时间(数字)
re.findall(r'\d+|(?<=;)\w+',text) # 匹配时间和单位

output:

['1', '2', '25']
['1', 'hour', '2', 'min', '25', 's']
re.findall(r'\d{2}+',text) # 匹配2位数字

查找替换两个字符串之间内容

替换字符target_text

xpath_path = '//*[contains(text(),"target_text")]/../td[5]/span' # xpath路径
repl = "需要替换成的字符串"
re.sub(r"(?<=\").*?(?=\")", repl, xpath_path) # 替换要查找的文本

output:

'//*[contains(text(),"需要替换成的字符串")]/../td[5]/span'

添加千位分割符

number = '12345678' 
re.sub(r"\B(?=(?:\d{3})+(?!\d))", ",",number) # 替换要查找的文本
re.sub(r"\B(?:(?:\d{3})+(?!\d))", ",",number) 

output:

'12,345,678'
'12,'

(?:\d{3})+(?!\d):

  • 查找3n(数字) + 非数字 组合

(?:exp) :

  • 匹配exp,不捕获匹配的文本(非获取匹配),也不给此分组分配组号,当执行了第一次匹配时,匹配到了行尾,直接将345678替换成了“,”。

参考文档

  1. 正则表达式30分钟入门教程:https://deerchao.cn/tutorials/regex/regex.htm
  2. github项目learn-regex:https://github.com/ziishaned/learn-regex
  3. https://www.w3schools.com/python/python_regex.asp
--THE END--

系列文章

1. VSCode + Python环境配置
2. Python PEP—Python增强提案
3. 正则表达式介绍及Python使用方法
4. Python笔记:List相关操作
5. Python笔记:字符串操作
6. Python函数的参数类型
7. Python反射介绍
8. Python笔记:属性值设置和判断变量是否存在
9. Python中的__new__、__init__以及metaclass
10. Python对象及内存管理机制
11. Python内存驻留机制
12. Python笔记:Python装饰器
13. Python中的闭包
14. Python笔记:lambda匿名函数
15. Python多线程与多进程
16. Python协程
17. Python笔记:日期时间获取与转换
18. Python笔记:命令行参数解析
19. Python 命令行参数解析之 Click
20. Python json文件读写
21. Python yaml文件读写
22. Python Scapy 报文构造和解析


欢迎关注公众号:「测试开发小记」及时接收最新技术文章!

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python 爬虫中,正则表达式是非常常用的技术,可以帮助我们从网页中提取出需要的信息。下面是一些常用的正则表达式符号和方法: 1. ".":匹配任意单个字符,除了换行符。 2. "^":匹配字符串的开始位置。 3. "$":匹配字符串的结束位置。 4. "*":匹配前一个字符出现 0 次或多次。 5. "+":匹配前一个字符出现 1 次或多次。 6. "?":匹配前一个字符出现 0 次或 1 次。 7. "{m}":匹配前一个字符出现 m 次。 8. "{m,n}":匹配前一个字符出现 m 到 n 次。 9. "(...)":分组匹配,匹配括号内的表达式。 10. "[...]":匹配括号内的任意一个字符。 11. "[^...]":匹配不在括号内的任意一个字符。 12. "\d":匹配数字,等同于 [0-9]。 13. "\D":匹配非数字,等同于 [^0-9]。 14. "\s":匹配空白字符,包括空格、制表符、换行符等。 15. "\S":匹配非空白字符。 16. "\w":匹配单词字符,包括字母、数字、下划线。 17. "\W":匹配非单词字符。 在 Python 中,使用 re 模块进行正则表达式的匹配。常用的方法包括: 1. re.compile(pattern):将正则表达式编译成一个对象,提高匹配效率。 2. re.search(pattern, string):在字符串中搜索匹配正则表达式的第一个位置。 3. re.findall(pattern, string):在字符串中搜索匹配正则表达式的所有位置,并返回一个列表。 4. re.sub(pattern, repl, string):将字符串中所有匹配正则表达式的字符替换为指定的字符串。 以上是一些常用的正则表达式符号和方法,希望能对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值