PYTHON基础技能 – 13 种常用文本匹配模式

释放双眼,带上耳机,听听看~!

文本匹配是编程中非常常见的任务,特别是在处理大量数据时。Python 提供了多种强大的工具来帮助我们实现高效的文本匹配。本文将详细介绍 13 种常用的文本匹配模式,从简单的字符串方法到复杂的正则表达式,逐步引导你掌握这些强大的工具。

1. 使用
1
in

关键字

最简单的文本匹配方式就是使用

1
in

关键字,检查一个字符串是否包含另一个字符串。


1
text&nbsp;=&nbsp;"Hello,&nbsp;world!"<br>substring&nbsp;=&nbsp;"world"<br><br>if&nbsp;substring&nbsp;in&nbsp;text:<br>&nbsp;&nbsp;&nbsp;&nbsp;print(f"'{substring}'&nbsp;is&nbsp;found&nbsp;in&nbsp;'{text}'")<br>else:<br>&nbsp;&nbsp;&nbsp;&nbsp;print(f"'{substring}'&nbsp;is&nbsp;not&nbsp;found&nbsp;in&nbsp;'{text}'")

输出:


1
'world'&nbsp;is&nbsp;found&nbsp;in&nbsp;'Hello,&nbsp;world!'

2. 使用
1
str.find()

1
str.find()

方法返回子字符串在字符串中的位置,如果找不到则返回 -1。


1
text&nbsp;=&nbsp;"Hello,&nbsp;world!"<br>substring&nbsp;=&nbsp;"world"<br><br>index&nbsp;=&nbsp;text.find(substring)<br>if&nbsp;index&nbsp;!=&nbsp;-1:<br>&nbsp;&nbsp;&nbsp;&nbsp;print(f"'{substring}'&nbsp;is&nbsp;found&nbsp;at&nbsp;index&nbsp;{index}&nbsp;in&nbsp;'{text}'")<br>else:<br>&nbsp;&nbsp;&nbsp;&nbsp;print(f"'{substring}'&nbsp;is&nbsp;not&nbsp;found&nbsp;in&nbsp;'{text}'")

输出:


1
'world'&nbsp;is&nbsp;found&nbsp;at&nbsp;index&nbsp;7&nbsp;in&nbsp;'Hello,&nbsp;world!'

3. 使用
1
str.index()

1
str.index()

方法类似于

1
str.find()

,但如果没有找到子字符串,它会抛出一个

1
ValueError


1
text&nbsp;=&nbsp;"Hello,&nbsp;world!"<br>substring&nbsp;=&nbsp;"world"<br><br>try:<br>&nbsp;&nbsp;&nbsp;&nbsp;index&nbsp;=&nbsp;text.index(substring)<br>&nbsp;&nbsp;&nbsp;&nbsp;print(f"'{substring}'&nbsp;is&nbsp;found&nbsp;at&nbsp;index&nbsp;{index}&nbsp;in&nbsp;'{text}'")<br>except&nbsp;ValueError:<br>&nbsp;&nbsp;&nbsp;&nbsp;print(f"'{substring}'&nbsp;is&nbsp;not&nbsp;found&nbsp;in&nbsp;'{text}'")

输出:


1
'world'&nbsp;is&nbsp;found&nbsp;at&nbsp;index&nbsp;7&nbsp;in&nbsp;'Hello,&nbsp;world!'

4. 使用
1
str.startswith()

1
str.startswith()

方法检查字符串是否以指定的前缀开头。


1
text&nbsp;=&nbsp;"Hello,&nbsp;world!"<br><br>if&nbsp;text.startswith("Hello"):<br>&nbsp;&nbsp;&nbsp;&nbsp;print(f"'{text}'&nbsp;starts&nbsp;with&nbsp;'Hello'")<br>else:<br>&nbsp;&nbsp;&nbsp;&nbsp;print(f"'{text}'&nbsp;does&nbsp;not&nbsp;start&nbsp;with&nbsp;'Hello'")

输出:


1
'Hello,&nbsp;world!'&nbsp;starts&nbsp;with&nbsp;'Hello'

5. 使用
1
str.endswith()

1
str.endswith()

方法检查字符串是否以指定的后缀结尾。


1
text&nbsp;=&nbsp;"Hello,&nbsp;world!"<br><br>if&nbsp;text.endswith("world!"):<br>&nbsp;&nbsp;&nbsp;&nbsp;print(f"'{text}'&nbsp;ends&nbsp;with&nbsp;'world!'")<br>else:<br>&nbsp;&nbsp;&nbsp;&nbsp;print(f"'{text}'&nbsp;does&nbsp;not&nbsp;end&nbsp;with&nbsp;'world!'")

输出:


1
'Hello,&nbsp;world!'&nbsp;ends&nbsp;with&nbsp;'world!'

6. 使用
1
str.count()

1
str.count()

方法返回子字符串在字符串中出现的次数。


1
text&nbsp;=&nbsp;"Hello,&nbsp;world!&nbsp;Hello,&nbsp;Python!"<br><br>count&nbsp;=&nbsp;text.count("Hello")<br>print(f"'Hello'&nbsp;appears&nbsp;{count}&nbsp;times&nbsp;in&nbsp;'{text}'")

输出:


1
'Hello'&nbsp;appears&nbsp;2&nbsp;times&nbsp;in&nbsp;'Hello,&nbsp;world!&nbsp;Hello,&nbsp;Python!'

7. 使用
1
str.replace()

1
str.replace()

方法用于替换字符串中的子字符串。


1
text&nbsp;=&nbsp;"Hello,&nbsp;world!"<br><br>new_text&nbsp;=&nbsp;text.replace("world",&nbsp;"Python")<br>print(f"Original:&nbsp;{text}")<br>print(f"Replaced:&nbsp;{new_text}")

输出:


1
Original:&nbsp;Hello,&nbsp;world!<br>Replaced:&nbsp;Hello,&nbsp;Python!

8. 使用
1
re

模块的基本匹配

1
re

模块提供了正则表达式的支持,可以进行更复杂的文本匹配。


1
import&nbsp;re<br><br>text&nbsp;=&nbsp;"Hello,&nbsp;world!"<br>pattern&nbsp;=&nbsp;r"world"<br><br>match&nbsp;=&nbsp;re.search(pattern,&nbsp;text)<br>if&nbsp;match:<br>&nbsp;&nbsp;&nbsp;&nbsp;print(f"Pattern&nbsp;'{pattern}'&nbsp;is&nbsp;found&nbsp;in&nbsp;'{text}'")<br>else:<br>&nbsp;&nbsp;&nbsp;&nbsp;print(f"Pattern&nbsp;'{pattern}'&nbsp;is&nbsp;not&nbsp;found&nbsp;in&nbsp;'{text}'")

输出:


1
Pattern&nbsp;'world'&nbsp;is&nbsp;found&nbsp;in&nbsp;'Hello,&nbsp;world!'

9. 使用
1
re.findall()

1
re.findall()

方法返回所有匹配的子字符串。


1
import&nbsp;re<br><br>text&nbsp;=&nbsp;"Hello,&nbsp;world!&nbsp;Hello,&nbsp;Python!"<br>pattern&nbsp;=&nbsp;r"Hello"<br><br>matches&nbsp;=&nbsp;re.findall(pattern,&nbsp;text)<br>print(f"Pattern&nbsp;'{pattern}'&nbsp;is&nbsp;found&nbsp;{len(matches)}&nbsp;times&nbsp;in&nbsp;'{text}'")

输出:


1
Pattern&nbsp;'Hello'&nbsp;is&nbsp;found&nbsp;2&nbsp;times&nbsp;in&nbsp;'Hello,&nbsp;world!&nbsp;Hello,&nbsp;Python!'

10. 使用
1
re.sub()

1
re.sub()

方法用于替换正则表达式匹配的子字符串。


1
import&nbsp;re<br><br>text&nbsp;=&nbsp;"Hello,&nbsp;world!"<br>pattern&nbsp;=&nbsp;r"world"<br>replacement&nbsp;=&nbsp;"Python"<br><br>new_text&nbsp;=&nbsp;re.sub(pattern,&nbsp;replacement,&nbsp;text)<br>print(f"Original:&nbsp;{text}")<br>print(f"Replaced:&nbsp;{new_text}")

输出:


1
Original:&nbsp;Hello,&nbsp;world!<br>Replaced:&nbsp;Hello,&nbsp;Python!

11. 使用
1
re.split()

1
re.split()

方法根据正则表达式分割字符串。


1
import&nbsp;re<br><br>text&nbsp;=&nbsp;"Hello,&nbsp;world!&nbsp;Hello,&nbsp;Python!"<br>pattern&nbsp;=&nbsp;r"!"<br><br>parts&nbsp;=&nbsp;re.split(pattern,&nbsp;text)<br>print(f"Text&nbsp;split&nbsp;by&nbsp;'!':&nbsp;{parts}")

输出:


1
Text&nbsp;split&nbsp;by&nbsp;'!':&nbsp;&#091;'Hello,&nbsp;world',&nbsp;'&nbsp;Hello,&nbsp;Python',&nbsp;'']

12. 使用
1
re.compile()

1
re.compile()

方法编译正则表达式,提高多次使用的效率。


1
import&nbsp;re<br><br>text&nbsp;=&nbsp;"Hello,&nbsp;world!&nbsp;Hello,&nbsp;Python!"<br>pattern&nbsp;=&nbsp;re.compile(r"Hello")<br><br>matches&nbsp;=&nbsp;pattern.findall(text)<br>print(f"Pattern&nbsp;'Hello'&nbsp;is&nbsp;found&nbsp;{len(matches)}&nbsp;times&nbsp;in&nbsp;'{text}'")

输出:


1
Pattern&nbsp;'Hello'&nbsp;is&nbsp;found&nbsp;2&nbsp;times&nbsp;in&nbsp;'Hello,&nbsp;world!&nbsp;Hello,&nbsp;Python!'

13. 使用
1
re.escape()

1
re.escape()

方法转义特殊字符,防止它们被解释为正则表达式的一部分。


1
import&nbsp;re<br><br>text&nbsp;=&nbsp;"Hello,&nbsp;world!&nbsp;Hello,&nbsp;Python!"<br>special_char&nbsp;=&nbsp;"."<br><br>escaped_char&nbsp;=&nbsp;re.escape(special_char)<br>pattern&nbsp;=&nbsp;f"{escaped_char}"<br><br>matches&nbsp;=&nbsp;re.findall(pattern,&nbsp;text)<br>print(f"Pattern&nbsp;'{escaped_char}'&nbsp;is&nbsp;found&nbsp;{len(matches)}&nbsp;times&nbsp;in&nbsp;'{text}'")

输出:


1
Pattern&nbsp;'\.'&nbsp;is&nbsp;found&nbsp;2&nbsp;times&nbsp;in&nbsp;'Hello,&nbsp;world!&nbsp;Hello,&nbsp;Python!'

实战案例:日志文件分析

假设你有一个日志文件,记录了用户的访问信息,格式如下:


1
2023-10-01&nbsp;12:00:00&nbsp;-&nbsp;User1&nbsp;-&nbsp;Page1<br>2023-10-01&nbsp;12:01:00&nbsp;-&nbsp;User2&nbsp;-&nbsp;Page2<br>2023-10-01&nbsp;12:02:00&nbsp;-&nbsp;User1&nbsp;-&nbsp;Page3<br>2023-10-01&nbsp;12:03:00&nbsp;-&nbsp;User3&nbsp;-&nbsp;Page1

我们需要分析这个日志文件,统计每个用户访问的页面次数。


1
import&nbsp;re<br>from&nbsp;collections&nbsp;import&nbsp;defaultdict<br><br><em>#&nbsp;假设这是日志文件的内容</em><br>log_content&nbsp;=&nbsp;"""<br>2023-10-01&nbsp;12:00:00&nbsp;-&nbsp;User1&nbsp;-&nbsp;Page1<br>2023-10-01&nbsp;12:01:00&nbsp;-&nbsp;User2&nbsp;-&nbsp;Page2<br>2023-10-01&nbsp;12:02:00&nbsp;-&nbsp;User1&nbsp;-&nbsp;Page3<br>2023-10-01&nbsp;12:03:00&nbsp;-&nbsp;User3&nbsp;-&nbsp;Page1<br>"""<br><br><em>#&nbsp;编译正则表达式</em><br>pattern&nbsp;=&nbsp;re.compile(r"(\d{4}-\d{2}-\d{2}&nbsp;\d{2}:\d{2}:\d{2})&nbsp;-&nbsp;(\w+)&nbsp;-&nbsp;(\w+)")<br><br><em>#&nbsp;创建一个字典来存储用户访问的页面次数</em><br>user_page_count&nbsp;=&nbsp;defaultdict(lambda:&nbsp;defaultdict(int))<br><br><em>#&nbsp;遍历日志内容,匹配每一行</em><br>for&nbsp;line&nbsp;in&nbsp;log_content.strip().split('\n'):<br>&nbsp;&nbsp;&nbsp;&nbsp;match&nbsp;=&nbsp;pattern.match(line)<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;match:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timestamp,&nbsp;user,&nbsp;page&nbsp;=&nbsp;match.groups()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user_page_count&#091;user]&#091;page]&nbsp;+=&nbsp;1<br><br><em>#&nbsp;输出结果</em><br>for&nbsp;user,&nbsp;pages&nbsp;in&nbsp;user_page_count.items():<br>&nbsp;&nbsp;&nbsp;&nbsp;print(f"User:&nbsp;{user}")<br>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;page,&nbsp;count&nbsp;in&nbsp;pages.items():<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(f"&nbsp;&nbsp;Page:&nbsp;{page},&nbsp;Count:&nbsp;{count}")

输出:


1
User:&nbsp;User1<br>&nbsp;&nbsp;Page:&nbsp;Page1,&nbsp;Count:&nbsp;1<br>&nbsp;&nbsp;Page:&nbsp;Page3,&nbsp;Count:&nbsp;1<br>User:&nbsp;User2<br>&nbsp;&nbsp;Page:&nbsp;Page2,&nbsp;Count:&nbsp;1<br>User:&nbsp;User3<br>&nbsp;&nbsp;Page:&nbsp;Page1,&nbsp;Count:&nbsp;1

总结

本文介绍了 13 种常用的文本匹配模式,包括简单的字符串方法和复杂的正则表达式。通过这些方法,你可以高效地处理各种文本匹配任务。每种方法都有其适用场景,选择合适的方法可以大大提高你的编程效率。最后,我们通过一个实战案例展示了如何使用这些方法来分析日志文件,统计用户访问的页面次数。

给TA打赏
共{{data.count}}人
人已打赏
安全运维

安全运维之道:发现、解决问题的有效闭环

2024-4-14 20:59:36

安全运维

稳定性建设 – 架构优化的关键策略

2025-2-11 17:15:56

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索