【python】常见的正则表达式用法;匹配字符串

本文仅仅展现了python正则表达式中的一小部分内容,但是包含了实际应用中非常被频繁使用的例子,本文重在举例,即不需要相关语法知识就能够会用~

re.match()

re.match() 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。

参数

  • pattern:匹配的正则表达式
  • string:要匹配的字符串。
  • flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志

我们可以使用group(num)groups()匹配对象函数来获取匹配表达式。
在这里插入图片描述
用span来获取匹配到的位置

import re
print(re.match('www', 'www.runoob.com').span())  # 在起始位置匹配 用span来获取匹配到的位置
print(re.match('com', 'www.runoob.com'))         # 不在起始位置匹配

out:

(0, 3)
None

再来看一下group的作用:
在这里插入图片描述

re.findall()

注意: match 和 search 是匹配一次 findall 匹配所有。

匹配两个字符串之间的字符串并返回

# 这种有两种方法
# 连同匹配条件(前后的字符串)一起返回
re.findall('prop.*?no', 'seed0prop0.2no1.pickle')
# 只返回中间字符串的内容
re.findall("prop(.*)no", 'seed0prop0.2no1.pickle')

out:
在这里插入图片描述

匹配某字符串之前/之后的所有字符串

# 这种有两种方法
# 返回prop之后的所有字符
re.findall('prop(.*)', 'seed0prop0.2no1.pickle')
# 返回prop之前的所有字符
re.findall("(.*)prop", 'seed0prop0.2no1.pickle')

out:
在这里插入图片描述

提取数字

提取所有数字(包括小数)

string = "Purchase100-0.76-0.63"
re.findall(r"\d+\.?\d*",string)

out:

['100', '0.76', '0.63']

在这里插入图片描述

提取形如“字符串+数字”中的数字

例如,要提取 Purchase100 后面的 100

string = "Purchase100-0.76-0.63"
re.findall(r'(?<=Purchase)\d+\.?\d*',string)
# 也可以这样操作
pattern = re.compile(r'(?<=Purchase)\d+\.?\d*')
pattern.findall(string)

out:

['100']

在这里插入图片描述
如果想要跟着 “purchase” 一块返回,可以这样:

string = "Purchase100-0.76-0.63"
re.findall(r'(?:Purchase)\d+\.?\d*',string)

out:

['Purchase100']

在这里插入图片描述

特殊字符有:
.
(点) 在默认模式,匹配除了换行的任意字符。如果指定了标签 DOTALL ,它将匹配包括换行符的任意字符。

^
(插入符号) 匹配字符串的开头, 并且在 MULTILINE 模式也匹配换行后的首个符号。

$
匹配字符串尾或者在字符串尾的换行符的前一个字符,在 MULTILINE 模式下也会匹配换行符之前的文本。 foo 匹配 ‘foo’ 和 ‘foobar’,但正则表达式 foo$ 只匹配 ‘foo’。 更有趣的是,在 ‘foo1\nfoo2\n’ 中搜索 foo.$,通常匹配 ‘foo2’,但在 MULTILINE 模式下可以匹配到 ‘foo1’;在 ‘foo\n’ 中搜索 $ 会找到两个(空的)匹配:一个在换行符之前,一个在字符串的末尾。

*
对它前面的正则式匹配0到任意次重复, 尽量多的匹配字符串。 ab* 会匹配 ‘a’,‘ab’,或者 ‘a’ 后面跟随任意个 ‘b’。

+
对它前面的正则式匹配1到任意次重复。 ab+ 会匹配 ‘a’ 后面跟随1个以上到任意个 ‘b’,它不会匹配 ‘a’。

?
对它前面的正则式匹配0到1次重复。 ab? 会匹配 ‘a’ 或者 ‘ab’。

*?, +?, ??

'*', '+',和 '?'修饰符都是 贪婪的;
它们在字符串进行尽可能多的匹配。
有时候并不需要这种行为。
如果正则式 <.*> 希望找到 '<a> b <c>',它将会匹配整个字符串,而不仅是 '<a>'。
在修饰符之后添加 ? 将使样式以 非贪婪`方式或者 :dfn:`最小 方式进行匹配; 
尽量 少 的字符将会被匹配。 
使用正则式 <.*?> 将会仅仅匹配 '<a>'

参考:
https://www.runoob.com/python/python-reg-expressions.html
https://blog.csdn.net/u010412858/article/details/83062200

### Python `re.findall` 方法详解 #### 参数说明 `re.findall(pattern, string, flags=0)` 是 Python 中用于查找字符串中所有匹配指定正则表达式的子串的方法。其返回值是一个列表,其中包含了所有匹配的结果。 - **pattern**: 表示要匹配正则表达式模式。 - **string**: 被搜索的目标字符串。 - **flags**: 可选参数,用于控制匹配行为。常见的标志有: - `re.IGNORECASE`: 忽略大小写。 - `re.MULTILINE`: 多行模式,在每行开头应用 `^` 和结尾 `$`。 - `re.DOTALL`: 让 `.` 特殊字符匹配包括换行在内的任意字符。 #### 示例代码 以下是几个具体的使用案例: ```python import re # 基本用法:查找所有包含特定单词的部分 text = "Python is fun and pythonic" result = re.findall(r"python", text, re.IGNORECASE) print(result) # 输出 ['Python', 'python'] [^3] # 查找 URL 地址中的重复部分 url = "https://docs.python.org/3/whatsnew/3.6.html" matches = re.findall(r"docs", url) print(matches) # 输出 ['docs'] [^2] # 使用字符集进行匹配 sample_text = "The numbers are: 123456, 234567, 345678." numbers = re.findall(r"[0-9]+", sample_text) print(numbers) # 输出 ['123456', '234567', '345678'] ``` #### 返回结果分析 当调用 `re.findall()` 时,如果正则表达式中有分组括号,则会仅返回捕获到的内容;如果没有分组,则整个匹配会被作为结果的一部分。 ```python # 不含分组的情况 email_dict = {'123456': '163', '234567': '163', '345678': '163'} keys = list(email_dict.keys()) matched_keys = re.findall(r"\d+", str(keys)) print(matched_keys) # 输出 ['123456', '234567', '345678'] [^5] # 含分组的情况 complex_pattern = r"(?P<first>\w)(?P<last>\w)" sentence = "hello world" group_results = re.findall(complex_pattern, sentence) print(group_results) # 输出 [('h', 'o'), ('w', 'd')] ``` 上述例子展示了如何通过不同的正则表达式来提取目标数据,并且强调了分组对于最终结果的影响。 #### 注意事项 在实际开发过程中需要注意一些常见陷阱,比如未处理空白行可能导致异常等问题[^4]。因此建议先清理输入数据再执行正则操作。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学渣渣渣渣渣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值