python之[正则表达式]--通配符使用方法(最新可用)

该文介绍了Python的re库在处理字符串时的基本用法,包括匹配任意字符、字符串边界、通配符的贪婪与懒惰模式,以及如何匹配数字、英文、中文和特殊字符。还展示了如何排除特定字符和移除不可见字符,是正则表达式入门的实用教程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【前沿查看】

.匹配任意字符,除了换行符
^匹配字符串开始的位置
$匹配字符串结束的位置,当出现多组符合的匹配时,返回字符串最后的那组匹配
*匹配 0,1,n 次前面的原子【贪婪模式:尽可能多的匹配】
?匹配 0,1 次前面的原子【懒惰模式:精确匹配】
+匹配 1,n 次前面的原子
\w+匹配字母数字及下划线
\d+匹配任意数字,等价于 [0-9]
[a-z]+匹配任何小写字母
[^a-z]+匹配除了小写字母的其他字符
{ j }前面的原子出现 j 次
{ j , }前面的原子至少出现 j 次
{ j , k }前面的原子至少出现 j 次,至多出现 k 次
i | j匹配 i 或 j ,若 i 与 j 同时出现,匹配 i 
( )组,限制这组数据的组合如()内所描述一样,只返回符合括号内描述的内容

一、导入re库

import re

二、通配符基本用法

(1)通配符匹配

txt = '请找出小猫吧,找出小猫吧,出小猫吧'
cat = re.findall('出(.*?)吧',txt)
print(cat)   # ['小猫', '小猫', '小猫']
print(cat[0])  # 小猫

# (.*?)遇到换行符会失效,可用以下方法
cat = re.findall('出([\s\S]*?)吧',txt)

import re
txt = '请找123456789出小猫吧,找123456789--------出小猫吧,出小猫吧'
cat = re.findall('找.*?出(.*?)吧,',txt)
print(cat)   # ['小猫', '小猫']

# 只找出最近距离的一个小猫
txt = '请找123456789出小猫吧,找123456789--------出小猫吧,出小猫吧'
cat = re.findall('找.{0,10}出(.*?)吧,',txt)
print(cat)   # ['小猫']

(2)多条件通配符匹配

单个字符,[]中会被视为单个字符

txt = '请找出小猫吧,找出小猫好吗,出小猫啦'
cat = re.findall('出(.*?)[吧|好|啦]',txt)
print(cat)  # ['小猫', '小猫', '小猫']


# 多个寻找
import re
txt = '请找出小猫吧,找出小猫好吗,出小猫啦'
cat = re.findall('出(.*?吧|.*?好|.*?啦)',txt)
print(cat)  # ['小猫吧', '小猫好', '小猫啦']

字符串,(?:...)是一个非捕获组,不会保存

import re
text = "cat Tom 123 and mouse Jerry 123"
matches = re.findall("(?:cat|mouse)(.*?)123", text)
print(matches)  # 输出: [' Tom ', ' Jerry ']

(3)通配符标记匹配

txt = '请找出小猫1,\n利用这个标记①,不要找出小猫2,'
cat = re.findall("出(.*?),.*?①",txt.replace("\n",""))[0]   # .* 无法匹配换行符,固要将换行符替换掉再匹配(或者字符串前加r转义掉)
print(cat)  # 小猫1

三、匹配数字

(1)匹配字符串所有数字

txt = "{'k':123,'k':12345,'k':1234567}"
num = re.findall('\d+',txt)
print(num)  # ['123', '12345', '1234567']

(2)只匹配5位的数字

txt = "{'k':123,'k':12345,'k':1234567}"
num = re.findall(r'\b\d{5}\b',txt)[0]
print(num)  # 12345

(3)匹配5~7位的数字

txt = "{'k':123,'k':12345,'k':1234567}"
num = re.findall(r'\b\d{5,7}\b',txt)
print(num)       # ['12345', '1234567']

四、英文匹配

(1)匹配英文、数字、下划线(_)

txt = "{'k':123,'k':12345,'k_':1234567}"
word = re.findall('\w+',txt)
print(word)  # ['k', '123', 'k', '12345', 'k_', '1234567']

(2)匹配全英文字母

txt = "{'A':123,'b':12345,'cc':1234567}"
word = re.findall('[a-zA-Z]+',txt)
print(word)  # ['A', 'b', 'cc']

(3)匹配数字+英文小大写

txt = "{'A':123,'b':12345,'c':1234567}"
word = re.findall('[0-9a-zA-Z]+',txt)
print(word)  # ['A', '123', 'b', '12345', 'c', '1234567']

(4)匹配数字+英文的32位秘钥

key = re.findall('\b[0-9a-zA-Z]{32}\b',txt)

五、中文匹配

(1)匹配中文

txt = "你好,世界,hello world,123"
num = re.findall('[\u4e00-\u9fa5]+',txt)
print(num)  # ['你好', '世界']

六、匹配非、特殊字符(前加^)

(1)匹配非数字

txt = "abc123一二三"
word = re.findall('[^0-9]+',txt)
print(word)  # ['abc', '一二三']

(2)非法文件名替换

file_name = '文件//:\|名.xlsx'
file_name = re.sub(r'[\\/:*?"<>|]','',file_name)
print(file_name)  # 文件名.xlsx

七、移除所有不可见字符

txt = "\uf08e打招呼声\uf08f喂!"
txt = ''.join(x for x in txt if x.isprintable())
print(txt)  # 打招呼声喂!
<think>好的,我现在需要帮助用户解决如何用正则表达式匹配负数的问题。首先,用户的问题很明确,就是要找到匹配负数的正则表达式。根据用户提供的引用内容,特别是引用[1]、[3]和[4],里面提到了关于负数的匹配方法,比如使用-?来匹配可能的负号。 首先,我应该回顾这些引用内容。引用[1]中的例子用了-?\d+来匹配正负数,这可以处理整数的情况。引用[3]提到了更复杂的模式,包括小数部分,比如-?\\d+(\\.\\d+)?,这样就能匹配小数和负数。而引用[4]讨论了Python中的正则表达式量词,比如使用{0,}来代替*,这可能对构建更精确的模式有帮助。 接下来,我需要考虑用户可能的场景。用户可能需要匹配各种形式的负数,比如整数负数如-123,或者小数负数如-45.67。另外,可能还需要考虑正数,或者不匹配正数,只匹配负数,但用户的问题主要是负数,所以需要明确是否包括正数。 根据引用内容,基本的模式是-?\d+,但这只能匹配整数,包括正负。如果用户还需要匹配小数,就需要像引用[3]中的模式,加入小数部分。所以,可能的正则表达式-?\d+(\.\d+)?,这样就能匹配整数和小数,包括负数。 另外,用户可能需要注意转义字符的问题,因为在不同的编程语言中,比如Java或Python,反斜杠的转义方式不同。例如,在Java中,正则表达式中的\d需要写成\\d,而在Python中,可以使用r前缀来避免转义问题。 还需要考虑负号是否必须存在。如果用户只想匹配负数,而不包括正数,那么应该去掉?,即使用^-\d+$,这样只匹配以负号开头的数字。但根据引用中的例子,用户可能也需要同时匹配正负数,所以可能需要明确这一点。 此外,边界情况需要考虑,比如数字前面可能有其他字符,或者确保匹配整个数字而不是部分。使用^和$来界定开始和结束,或者在匹配时使用单词边界\b。 可能的错误点:忘记转义小数点,在正则表达式中,.是通配符,所以需要转义为\.,但在Java字符串中又需要写成\\.,这可能导致混淆。例如,正确的模式应该是-?\d+(\.\d+)?,但在Java中要写成-?\\d+(\\.\\d+)? 总结步骤: 1. 确定需要匹配的数字类型:整数、小数,是否包括正数。 2. 构建正则表达式- 仅整数负数:^-?\d+$ - 包括小数:^-?\d+(\.\d+)?$ - 仅负数(必须带负号):^-\d+(\.\d+)?$ 3. 考虑编程语言中的转义需求,如Java需要双反斜杠。 4. 提供示例代码,如Java和Python的实例,参考用户提供的引用中的代码结构。 5. 提醒可能的边界情况,如数字前后有其他字符,是否需要使用单词边界或^$。 现在需要将这些整理成一个清晰的回答,分步骤说明,并给出示例,同时引用相关的引用内容作为支持。例如,引用[1]中的Java代码使用-?\\d+,可以用于整数匹配,而引用[3]中的模式则扩展到了小数部分。同时,提醒用户注意转义和语言差异,如Python使用r字符串。 最后,生成相关问题,可能涉及小数匹配、只匹配负数、不同编程语言的实现等,参考用户之前的问题结构。</think>要使用正则表达式匹配负数,需结合负号 `-` 和数字匹配规则。以下是具体方法和示例: --- ### **1. 匹配整数负数** - **正则表达式**:`^-?\d+$` - `-?`:可选负号(`?` 表示0或1次) - `\d+`:至少一个数字 - `^` 和 `$`:严格匹配整个字符串,避免部分匹配 **示例**:`-123`、`456`(正数也会匹配) **Java代码示例**(参考引用[1][^1]): ```java Pattern pattern = Pattern.compile("-?\\d+"); ``` --- ### **2. 匹配小数(含负数)** - **正则表达式**:`^-?\d+\.?\d*$` 或 `^-?\d+(\.\d+)?$` - `\.?\d*`:可选小数点及小数部分(如 `-12.34`) - `(\\.\\d+)?`:更严格的写法(参考引用[3][^3]) **示例**:`-5.6`、`7.8` **Python代码示例**(参考引用[4][^4]): ```python import re pattern = r"-?\d+\.?\d*" re.findall(pattern, "温度从-10.5升至25.3") ``` --- ### **3. 仅匹配负数(排除正数)** - **正则表达式**:`^-\d+(\.\d+)?$` - `^-`:必须以负号开头 - `\d+`:整数部分至少一位数字 **示例**:`-42`、`-3.14`(不匹配正数) --- ### **4. 边界匹配(避免部分匹配)** 若需从文本中提取负数(如 `价格-50元`),需移除 `^` 和 `$`,改用单词边界 `\b`: - **正则表达式**:`-?\b\d+(\.\d+)?\b` **示例**:从 `气温-15.2℃` 中提取 `-15.2` --- ### **注意事项** - **转义字符**:在Java中需用双反斜杠(如 `\\d`),Python可用原始字符串 `r""`。 - **符号位置**:负号需紧邻数字(如 `- 5` 会被视为无效)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

云霄IT

感谢感谢!

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

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

打赏作者

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

抵扣说明:

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

余额充值