python之一文秒懂re正则表达式

引言

Python 中的正则表达式是一个强大的工具,用于处理字符串查找、替换、分割等。正则表达式使用特殊语法来表示一系列匹配字符串的字符规则。Python 通过 re 模块提供对正则表达式的支持。

1. 查找

1.re.search(pattern, string[, flags=0])

  • 功能:在字符串中从左到右扫描,寻找第一个匹配正则表达式的子串。
  • 返回值:如果找到匹配项,返回一个Match对象,其中包含有关匹配的信息,如匹配的文本、位置等。如果没有找到匹配项,则返回None
  • 应用场景:当你只需要找到第一个匹配项,并且不关心其他可能的匹配项时,使用search
# search 返回match 或 none
result = re.search(r"abc", "0bcabcdabcde", re.I)  # I 不区分大小写
print(result, result.start(), result.end(), result.group())
#<re.Match object; span=(3, 6), match='abc'> 3 6 abc

2. re.findall(pattern, string[, flags=0])

  • 功能:在字符串中从左到右扫描,寻找所有匹配正则表达式的子串。
  • 返回值:返回一个列表,包含所有匹配的子串。如果没有找到匹配项,则返回空列表。
  • 应用场景:当你需要找到字符串中所有匹配正则表达式的子串时,使用findall
result = re.findall(r"abc", "0bcabcdabcde", re.I)
print(result)
# ['abc', 'abc']

3. re.finditer(pattern, string[, flags=0])

  • 功能:在字符串中从左到右扫描,寻找所有匹配正则表达式的子串,但返回的是一个迭代器。
  • 返回值:返回一个迭代器,迭代器中的每个元素都是一个Match对象,包含有关匹配的信息。如果没有找到匹配项,则迭代器为空。
  • 应用场景:当你需要遍历所有匹配项,并对每个匹配项执行某些操作时(比如获取匹配项的位置或进行复杂的处理),使用finditer
result = re.finditer(r"abc", "0bcabcdabcde")
for data in result:
    print(data.group())
# abc
# abc

3.替换

1. sub ,返回替换后的字符串

# \w 匹配字母数字下划线
result = re.sub(r"a\wc", "哈哈哈", "0bcabcda2cde")
print(result)
# 0bc哈哈哈d哈哈哈de

2. subn ,元组形式返回替换后的结果和替换次数

# \d 只匹配数字,不关心字符
result = re.subn(r"a\dc", "哈哈哈", "0bca1cdabcde")
print(result)
# ('0bc哈哈哈dabcde', 1)

4. 分割

# split  返回切割后的内容
result = re.split(r"abc", "0bcabcdabcde", maxsplit=1) #设置最大分割次数
print(result)
#['0bc', 'dabcde']

5. 常用指令

1. \w  \W \d  \D  \s  \S

# \w 匹配字母 数字 下划线
# \W 匹配非字母 非数字 非下划线
# \d 匹配数字
# \D 匹配非数字
# \s 匹配空白
# \S 匹配非空白
result1 = re.findall(r"\w","abc123+-*/_") # 打印
result2 = re.findall(r"\W", "abc123+-*/_")
result3 = re.findall(r"\d","abc123+-*/_")
result4 = re.findall(r"\D","abc123+-*/_")
result5 = re.findall(r"\s","abc123+-*/_")
result6 = re.findall(r"\S","abc123+-*/_")
print(result1,result2,result3,result4,result5,result6)

# 1打印 ['a', 'b', 'c', '1', '2', '3', '_']
# 2打印 ['+', '-', '*', '/']
# 3打印 ['1', '2', '3']
# 4打印 ['a', 'b', 'c', '+', '-', '*', '/', '_']
# 5打印 []
# 6打印 ['a', 'b', 'c', '1', '2', '3', '+', '-', '*', '/', '_']

 2.  .  ^  $

# . 任意字符 除了\n 除非使用re.M
# ^abc   abcd\nabcd开头不能匹配\n   除非使用re.M
# abc$   以abc 结尾 不能匹配\n 比如:abc\nadc 结果就一个 abc  除非使用re.M

result1 = re.findall(r".","abc\nabc")
result2 = re.findall(r"^abc","abc\nabc",re.M)
result3 = re.findall(r"a\wc$", "abc\nadc", re.M)
print(result1,result2,result3)

#result1 打印 ['a', 'b', 'c', 'a', 'b', 'c']
#result2 打印 ['abc', 'abc']
#result3 打印 ['abc', 'adc']

3. *  +  ? 

# *  代表有>=0 个
# +  代表有>=1 个
# ?  代表有0个或1个
result1 = re.findall(r"\d*", "123456789")
result2 = re.findall(r"\d+", "123456789")
result3 = re.findall(r"\d?", "123456789")
print(result1,result2,result3)

#result1 打印 ['123456789', '']
#result2 打印 ['123456789']
#result3 打印 ['1', '2', '3', '4', '5', '6', '7', '8', '9', '']

4. {n}  {m,n}  [m-n]  |  ()  

{n}:这个量词用于指定前面的字符或子表达式在匹配时必须恰好出现n次。

print(re.match(r'a{3}', 'aaa').group())  # 输出: aaa  

{m,n}:这个量词用于指定前面的字符或子表达式在匹配时至少出现m次,但不超过n次。如果省略n,则表示至少出现m次,没有上限。 

print(re.findall(r'a{2,4}', 'aaaaa'))  # 输出: ['aaaa', 'a']  

[m-n]:这个字符集(也称为字符类)用于匹配方括号内的任一字符。

# 使用[m-n](注意这里只是示例字符集,并非直接m到n的范围)  
print(re.match(r'[a-z]', 'b').group())  # 输出: b 

|:这个操作符称为“或”操作符,用于匹配两个或多个表达式中的任意一个。示例:a|b 匹配a或b。 示例:(a|b)c 匹配ac或bc。 

# 使用|  
print(re.search(r'a|b', 'cab').group())  # 输出: a  

​​​​():圆括号在正则表达式中有多种用途,但最常见的用途之一是分组。分组可以让我们将表达式的一部分作为一个整体来引用或处理。示例:(abc)* 匹配零个或多个abc。 分组还允许我们通过反向引用(\1, \2...)来引用之前的分组。 示例:(\w+)\s+\1 匹配如 hello hello 这样的重复单词序列(\1引用第一个分组匹配的内容)。

# 使用()  
print(re.findall(r'(\w+)\s+\1', 'hello hello world'))  # 输出: ['hello']

  • 14
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值