15、Python学习与应用全攻略

Python学习与正则表达式应用

Python学习与应用全攻略

1. 开启Python探索之旅

恭喜你,已经具备了用Python完成许多惊人事情的基础,现在真正有趣的探索之旅才刚刚开始!学习Python的最佳方式是解决实际问题。即便刚开始写的代码可能不够美观或高效,但它是有用的。若觉得没有Python能解决的问题,不妨挑选一个感兴趣的流行模块,围绕它创建自己的项目。

Python强大的原因之一在于其活跃的社区。如果你认识正在学习Python的人,不妨伸出援手。因为只有当你能向他人解释清楚一个概念时,才意味着你真正掌握了它。

如果你对网页开发感兴趣,可以深入学习更高级的Python网页开发课程,如Python网页开发和Django高级网页开发。当你准备好时,还可以参与GitHub上的开源项目。若你喜欢解谜,不妨尝试解决Project Euler上的数学挑战或Python Challenge系列谜题。你也可以报名参加Udacity的免费CS101课程,学习如何用Python构建基础搜索引擎。

在学习过程中遇到困难很正常,要相信肯定有人之前遇到过同样的问题并可能已经解决了。你可以在网上搜索答案,特别是在Stack Overflow上,或者加入Python社区寻求帮助。实在没办法时,试试 import this ,花点时间感悟Python的魅力。

2. Python安装指南
2.1 检查当前版本
  • Mac和Linux :自10.4版本起的所有Mac OS X系统和大多数Linux发行版都预装了Python 2.7.x的最新版本。你可以打开终端,输入 python 进入Python解释器来查看版本,输出示例如下:
$ python
Python 3.5.1 (v3.5.1:37a07cee5969, Dec  5 2015, 21:12:44)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>

若版本低于3.5,请下载最新版本。

2.2 安装Python
  • Mac :需要Python 3.5+版本。若需下载新版本,可下载3.5.1的最新安装程序,下载后双击文件进行安装。
  • Linux
    • 如果你使用的是Ubuntu、Linux Mint或其他基于Debian的系统,在终端输入以下命令安装Python:
$ sudo apt-get install python3.5
- 也可以直接从Python官方网站下载压缩包,下载后运行以下命令:
$ tar -zxvf [mytarball.tar.gz]
$ ./configure
$ make
$ sudo make install

若遇到问题或使用的是其他Linux发行版,可以使用包管理器或在网上搜索适合你系统的安装方法。
- Windows
- 从Python官方网站下载Python 3.5.1,Windows版本以MSI包形式分发。下载后双击启动安装程序,按提示完成安装,默认安装路径为 C:\Python35
- 测试安装 :打开命令提示符,输入 \Python35\python.exe 并回车,若看到类似以下输出,则表示安装成功:

Python 3.5.1 (v3.5.1:37a07cee5969, ...) on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

>>> 表示你已进入Python解释器,可以交互运行Python代码。输入 exit() 并回车可退出解释器。
- 添加环境变量 :为了方便运行Python脚本,需要将Python添加到系统的PATH环境变量中。下载的是Python 3.5.1版本,需要添加以下目录到PATH:

C:\Python35\ 
C:\Python35\Scripts\ 
C:\PYTHON35\DLLs\ 
C:\PYTHON35\LIB\ 

打开PowerShell,运行以下命令:

[Environment]::SetEnvironmentVariable("Path",
    "$env:Path;C:\Python35\;C:\Python35\Scripts\;
    C:\PYTHON35\DLLs\;C:\PYTHON35\LIB\;", "User")
- **验证安装**:打开新的终端,输入`python`,若看到正确的版本信息,则表示安装和配置成功。若安装了多个Python版本,可能需要使用`python3`。
3. 正则表达式基础

正则表达式(也称为regex、regexp或RE)是用于快速查找和提取文本模式的强大工具。它并非Python独有,而是一种通用的编程概念,可用于多种编程语言。正则表达式有自己独特的语法,虽然难学但非常实用。掌握后,你可以用简洁的语法在文本中查找复杂模式。

3.1 基本语法

正则表达式的基本思想是将普通文本与一些“特殊”字符结合,这些特殊字符用于表示不同类型的模式。例如,星号 * 表示前面的字符出现零次或多次。以下是一些基本示例:
| 表达式 | 描述 | 匹配示例 |
| ---- | ---- | ---- |
| a | 匹配字符“a” | a |
| happy | 匹配整个单词“happy” | happy |
| h.ppy | “.”匹配任意单个字符 | happy, hippy |
| ha ppy | “ ”匹配零个或多个“a” | hppy, happy, haaappy |
| us|them | “|”使用OR匹配“us”或“them” | us, them |

你可以查看Python官方文档了解所有特殊字符,或参考PyRegex获取简洁版本说明。 * 特殊字符类似于文件搜索中的通配符, | 特殊字符与Python中的 or 作用相同,还可以使用括号来指定某些模式的优先级。

3.2 何时使用正则表达式

一般原则是,除非绝对必要,否则优先使用Python的基本字符串匹配方法,如 find() replace() ,它们更容易理解。即先从内置函数开始,若代码变得过于复杂,再考虑使用正则表达式。

例如,当我们明确知道要查找的内容时,可以使用基本的Python函数:

str = 'Explicit is always better than implicit.'
print(str.replace('always', 'much'))

输出:

Explicit is much better than implicit.

但如果要处理复杂的模式,如标准化电话号码列表:

import re

phone_list = [
    "555-555-5555","555 555 5555","555.555.5555",
    "555.555.5555","555.555-5555","555/555/5555"
]
pattern = r'\D'
for phone in phone_list:
    phone_num = re.sub(pattern, "-", phone)
    print("Phone Num: ", phone_num)

使用正则表达式可以更简单地解决问题。判断何时使用正则表达式而非 find() replace() 的另一个好方法是,当正则表达式满足以下条件时:
1. 更容易理解;
2. 表达清晰、简洁的意图;
3. 更短且易于修改和调整。

4. 正则表达式函数
4.1 re.match()和re.search()

re.match() re.search() re 模块中最常用的查找文本的函数。
- re.match(pattern, string) :仅在字符串开头搜索匹配项。
- re.search(pattern, string) :在字符串的任意位置搜索匹配项。

在查看示例之前,我们会使用 group() 进一步分离匹配文本的部分,通过在表达式中使用括号来指定组。

示例1

import re
text = "easier said than done"

# re.match
find_match = re.match(r'done', text)
if find_match:
    print("Found: {}".format((find_match).group()))
else:
    print("Not found.")

# re.search
find_match = re.search(r'done', text)
if find_match:
    print("Found: {}".format((find_match).group()))
else:
    print("Not found.")

输出:

Not found.
Found: done

示例2

import re
text = "My name is Inigo"
m = re.match(r'(.*) name (.s) .*', text)
if m:
    print("group(0):", m.group(0))
    print("group(1):", m.group(1))
    print("group(2):", m.group(2))
else:
    print("Sorry. No match!!")

输出:

group(0): My name is Inigo
group(1): My
group(2): is

分析正则表达式:
- .* :匹配零个或多个任意字符。
- name :匹配整个单词“name”。
- .s :匹配任意单个字符,然后是字符“s”。

组的定义:
- 组0定义了整个正则表达式匹配的字符串。
- 组1和组2表示子组(由括号内的内容定义)。

示例3

import re
string = "Inigo Montoya"
m = re.match(r"(?P<first>\w+)\W+(?P<last>\w+)", string)
if m:
    print("group(0):", m.group(0))
    print("group(1):", m.group(1))
    print("group(2):", m.group(2))
    print("")
    print('group("first") : ', m.group("first"))
    print('group("last") : ', m.group("last"))
else:
    print("Sorry. No match!!")

这里我们定义了组名,使组更易于阅读。

4.2 re.sub()

re.sub() 用于搜索和替换文本,语法为 re.sub(pattern, replacement, string, max=0) 。该函数会替换特定模式的所有出现,除非提供了正的 max 值。

示例

import re
text = "Real Python teaches programming and web development through hands-on, interesting examples."
pattern = re.sub("hands-on", "practical", text, 0)  # no max; replace all
print(pattern)

输出:

Real Python teaches programming and web development through practical, interesting examples.
5. 正则表达式更多练习
5.1 问题1
import re
validation = re.compile(r'[A-Za-zs.]')
name = raw_input("Please enter your name: ")
while not validation.search(name):
    print "Please enter your name correctly!"
    name = raw_input("Please enter your name: ")
print("\nYour name is {}!".format(name))

要求:
1. 阅读Python官方文档中关于 re.compile 函数的内容,用自己的话描述如何使用它以及为什么要使用它。
2. 多次运行程序,测试验证和未验证的输入。
3. 重构程序,确保输入是电子邮件地址:测试字母数字文本、“@”符号、另一个字符串、句点和结尾的“com”的存在。
4. 奖励:允许其他域名,如com、org、edu或net。

5.2 问题2

打开 phone_list.py 文件,其中包含一个字典列表:

data = [
    {'name': 'Debra Hardy', 'phone': '(140) 732-2619'},
    {'name': 'Claudia Baker', 'phone': '(833) 362-0448'},
    {'name': 'Justin Lara', 'phone': '(609) 832-1565'},
    {'name': 'Judah Battle', 'phone': '(199) 834-7433'},
    {'name': 'Florence Nielsen', 'phone': '(769) 666-4576'},
    {'name': 'Orlando Kirby', 'phone': '(618) 110-3675'},
    {'name': 'Tucker Webb', 'phone': '(990) 295-9494'},
    {'name': 'Abel Jacobs', 'phone': '(840) 537-3516'},
    {'name': 'Ann Crane', 'phone': '(345) 876-2223'},
    ...
]

编写一个名为 phone-book-fun.py 的Python脚本,查找所有姓氏为“Hardy”或名字以字母J开头的人,并输出他们的名字、姓氏和电话号码。

6. 正则表达式作业
6.1 数据清理作业

使用Sublime Text(或支持正则表达式的文本编辑器),结合正则表达式,将 _sloppy_data.tsv 转换为 _clean_data.tsv

sloppy_data.tsv 是一个包含不必要空行和空格的制表符分隔值(TSV)文件,在旧版本的Microsoft Excel中难以正确打开。虽然只有二十行,但假设它有20,000行,手动修复会很麻烦,因此使用正则表达式自动化处理。需要进行以下更改:
1. 移除空行。
2. 移除每行开头的空格。
3. 移除方括号内的数字(如 [1] )。
4. 移除第一列数字。
5. 移除 Inc. , Inc. Inc Incorporated
6. 移除区号 (XXX) 和电话号码 XXX-XXXX 之间的空格。

在开始作业之前,先看一个简单示例。在文本编辑器中添加“N.Y.C”到空白文件,使用正则表达式将“N.Y.C”替换为“NYC”。在Sublime Text中,点击“查找”然后“替换”,在“查找”字段输入正则表达式 \. ,“替换”字段留空,激活正则表达式搜索,然后点击“全部替换”。这里使用 \. 而不是 . 是因为 . 在正则表达式中是特殊字符,需要使用反斜杠转义。

6.2 复习作业
  1. 复制以下代码并保存为 regex_review.py
  2. 运行文件,所有 print 语句将返回 False
  3. 修改变量,使所有 print 语句返回 True
zero = "Real Ruby"
one = "5/25/14"
two = "A99 9AA"
three = r''
four = "6.76"
five = ["happy","birthday"]
six = r'\.(doc)$'
seven = "My email is michael@mherman.org"
# DO NOT CHANGE ANYTHING BELOW THIS LINE #
# -------------------------------------- #
print("zero:  {}".format(zero == re.search(r'[P].*', "This is Real Python").group()))
print("one:   {}".format(one == re.search(r'\d{1,2}\/\d{1,2}\/\d{4}', "5/25/2014").group()))
print("two:   {}".format(two == re.match(
    r'[A-Z]([A-Z](\d{1,2}|\d[A-Z])|\d{1,2})\s\d[A-Z]{2}',
    "A88 8AA",
    re.VERBOSE
).group()))
print("three: {}".format(bool(re.search(three, "B4c r79").group())))
print("four:  {}".format(bool(re.search(r'\$[0-5]\.\d\d', four))))
print("five:  {}".format(bool(re.search(r'\ha{4,10}ppy\b', five[0]))))
files = ['test.doc', 'test.odt', 'test.ddt', 'doc', 'testodt', 'test.doc']
matched_files = [file for file in files if re.search(six, file)]
print("six:   {}".format(len(matched_files) == 3))
email_regex = r'\w+@\w+\.(com|org|edu|net)'
text = "My email is michael@mherman.org"
redacted_text = re.sub(email_regex, '(email redacted)', text)
print("seven: {}".format(seven == redacted_text))

通过以上学习和练习,你可以更深入地掌握Python和正则表达式的使用,解决各种实际问题。希望你在学习过程中不断探索,享受编程的乐趣!

Python学习与应用全攻略(续)

7. 正则表达式学习总结与拓展

正则表达式在Python编程中是一个强大且实用的工具,但同时也具有一定的复杂性。在学习和使用正则表达式时,我们需要不断地实践和总结,才能更好地掌握它。

7.1 学习要点回顾
  • 基本语法 :要牢记各种特殊字符的含义和用法,如 * (匹配零个或多个前面的字符)、 . (匹配任意单个字符)、 | (逻辑或)等。通过组合这些特殊字符和普通文本,可以构建出各种复杂的模式。
  • 函数使用 re.match() re.search() re.sub() 是最常用的正则表达式函数。 re.match() 从字符串开头匹配, re.search() 在整个字符串中查找匹配项, re.sub() 用于替换匹配的文本。
  • 组的概念 :使用括号 () 可以定义组,方便提取和处理匹配的部分。还可以为组命名,提高代码的可读性。
7.2 拓展学习建议
  • 阅读官方文档 :Python官方文档是学习正则表达式的权威资料,其中包含了详细的函数说明和示例。通过阅读文档,可以深入了解每个函数的参数和用法。
  • 在线练习平台 :有许多在线平台提供正则表达式的练习题目,如Regex101等。在这些平台上,你可以实时测试自己编写的正则表达式,查看匹配结果,并获得反馈和提示。
  • 参与开源项目 :在GitHub等开源平台上,有很多使用正则表达式的项目。参与这些项目的开发和维护,可以学习到其他开发者的优秀实践和经验。
8. Python学习路径规划

学习Python是一个长期的过程,需要有明确的学习路径和目标。以下是一个适合初学者的Python学习路径规划:

8.1 基础入门
  • 学习Python语法 :掌握Python的基本数据类型(如整数、浮点数、字符串、列表、元组、字典等)、控制结构(如if语句、for循环、while循环等)和函数定义。
  • 实践小项目 :通过完成一些简单的小项目,如计算器、猜数字游戏等,巩固所学的语法知识。
8.2 进阶学习
  • 学习面向对象编程 :了解类、对象、继承、多态等面向对象编程的概念,并学会使用Python实现面向对象的程序。
  • 掌握常用模块 :学习Python的标准库和第三方库,如 os sys re requests pandas 等,提高编程效率。
8.3 专业领域深入
  • 网页开发 :学习Django、Flask等网页开发框架,构建动态网页应用。
  • 数据科学 :掌握NumPy、SciPy、Matplotlib等数据处理和可视化库,进行数据分析和机器学习。
  • 自动化测试 :学习 unittest pytest 等测试框架,编写自动化测试代码。
8.4 持续学习与实践
  • 关注技术博客和社区 :关注Python相关的技术博客和社区,了解最新的技术动态和发展趋势。
  • 参与开源项目和竞赛 :通过参与开源项目和竞赛,与其他开发者交流和合作,提升自己的技术水平。
9. Python学习资源推荐

除了上述提到的官方文档和在线练习平台外,还有许多其他的学习资源可以帮助你更好地学习Python:

9.1 书籍
  • 《Python编程:从入门到实践》:适合初学者,以项目驱动的方式介绍Python编程。
  • 《Python核心编程》:内容全面,深入讲解Python的核心概念和高级特性。
  • 《流畅的Python》:注重Python的高级用法和最佳实践,适合有一定基础的开发者。
9.2 在线课程
  • Coursera :提供了许多Python相关的课程,如《Python for Everybody》、《Applied Data Science with Python》等。
  • Udemy :有大量的Python课程可供选择,涵盖了从入门到高级的各个层次。
  • 慕课网 :国内知名的在线学习平台,提供了丰富的Python课程和实战项目。
9.3 社区和论坛
  • Python官方论坛 :是Python开发者交流和讨论的官方平台,有许多专业的开发者分享经验和解决问题。
  • Stack Overflow :是一个全球知名的编程问答社区,你可以在这里找到各种Python相关的问题和答案。
  • 知乎 :国内的知识分享平台,有很多Python相关的话题和讨论,可以从中获取不同的观点和建议。
10. 总结与展望

通过本文的介绍,我们了解了Python学习的多个方面,包括学习方法、安装配置、正则表达式的使用、学习路径规划和资源推荐等。希望这些内容能够帮助你更好地学习和掌握Python。

在未来的学习过程中,要保持积极的学习态度,不断实践和探索。Python作为一门功能强大、应用广泛的编程语言,在数据科学、人工智能、网页开发等领域都有着广阔的应用前景。相信通过不断努力,你一定能够成为一名优秀的Python开发者,实现自己的职业目标。

以下是一个简单的mermaid流程图,展示了Python学习的基本流程:

graph LR
    A[基础入门] --> B[进阶学习]
    B --> C[专业领域深入]
    C --> D[持续学习与实践]

总之,学习Python是一个充满挑战和乐趣的过程。只要坚持不懈,不断积累和提高,你一定能够在Python的世界中取得优异的成绩。祝你学习顺利!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值