第一章、正则表达式规则
在正则表达式中,{}
用于表示重复模式的次数,比如 {n}
表示前一个模式重复 n 次。但是,{}
本身并不支持嵌套使用,例如 {2}{3}
并不是合法的语法。
如果想要实现一个模式重复的次数是另一个模式重复次数的倍数,可以使用括号和 *
或 +
等符号来组合表达式。
例如,要匹配连续两次重复三次的模式,可以使用括号和 *
来表示:
(pattern){3}
:表示重复pattern
三次。((pattern){3}){2}
:表示重复连续两次重复pattern
三次的模式。
示例:
import re
text = "hellohellohellohello"
pattern = r'(hello){3}'
match = re.search(pattern, text)
if match:
print("Pattern found:", match.group())
这个示例中,(hello){3}
表示匹配连续三次的 hello
,然后我们可以根据实际需求嵌套这种表达式来实现复杂的匹配模式。
在正则表达式中,*
、+
、?
是用来指示匹配模式重复次数的特殊字符。
*
表示前一个模式可以出现 0 次或多次。+
表示前一个模式可以出现 1 次或多次。?
表示前一个模式可以出现 0 次或 1 次,也可以用来表示非贪婪匹配。
这三个符号是用于指示重复次数的,它们可以单独使用,也可以和其他正则表达式组合使用。例如,*
可以和其他模式一起使用来匹配零次或多次前一个模式,+
可以匹配一次或多次,?
则可以表示可选的模式(0 次或 1 次),同时也可以用来表示非贪婪匹配。
贪婪匹配会尽可能多地匹配符合条件的文本,而非贪婪匹配则会尽可能少地匹配。在正则表达式中,*
、+
、?
后面可以加上 ?
符号,表示非贪婪匹配。
示例:
*?
:表示匹配模式零次或多次,并且是非贪婪匹配。+?
:表示匹配模式一次或多次,并且是非贪婪匹配。??
:表示匹配模式零次或一次,并且是非贪婪匹配。
例如,如果有字符串 "abcde"
,可以使用 .*?
来匹配最短的可能的字符串,即空字符串。而使用 .*
则会匹配整个字符串 "abcde"
。
import re
text = "abcde"
pattern1 = ".*?"
pattern2 = ".*"
match1 = re.search(pattern1, text)
match2 = re.search(pattern2, text)
print("Non-greedy match:", match1.group()) # 输出:''
print("Greedy match:", match2.group()) # 输出:abcde
在正则表达式中,?
在不同的位置和语境下可以表示不同的含义,但最常见的是表示非贪婪匹配
第二章、re标准模块
一、概述
re
是 Python 中用于处理正则表达式的内置模块。正则表达式是一种强大的文本匹配和搜索工具,可以用于检查字符串中是否包含特定模式的文本、替换文本、提取信息等操作。
主要函数:
re.search(pattern, string)
: 在字符串中搜索指定模式的匹配项,返回第一个匹配对象。re.match(pattern, string)
: 在字符串开头匹配指定模式,如果开头就匹配到,则返回匹配对象。re.findall(pattern, string)
: 在字符串中找到所有匹配的子串,并返回一个列表。re.finditer(pattern, string)
: 在字符串中找到所有匹配的子串,并返回一个迭代器。re.sub(pattern, repl, string)
: 在字符串中搜索指定模式的匹配项,并用替换文本repl
替换它们。
常用方法:
group()
: 返回匹配的字符串。start()
: 返回匹配的起始位置。end()
: 返回匹配的结束位置。span()
: 返回一个元组,包含匹配的起始和结束位置。
示例:
import re
text = "Hello, my phone number is 123-456-7890. Call me!"
print(text.__len__()) # 48
# 在文本中查找匹配项
match = re.search(r'\d{3}-\d{3}-\d{4}', text)
if match:
print("Phone number found:", match.group()) ## Phone number found: 123-456-7890
print("Start position:", match.start()) # Start position: 26
print("End position:", match.end()) # End position: 38
这段代码使用了 re.search()
来在文本中搜索一个电话号码的模式。如果找到匹配项,就会打印出匹配的字符串以及它的起始和结束位置。
正则表达式是一种强大的文本处理工具,可以进行复杂的模式匹配和提取,但也需要一定的学习和理解成本。在处理文本时,re
模块是一个强大的工具,能够帮助你实现各种文本处理需求。
import re
# result = re.search(r"\d+", "ab12db$")
# print(result)
st = "aac##xyz"
match = re.search(r"(^a*)(c.*)#(XY)", st, re.I)
# Match对象
print("====================match对象====================")
print(match) # <re.Match object; span=(0, 7), match='aac##xy'>
# 匹配时使用的Pattern对象(正则表达式)
print("====================匹配时使用的Pattern对象(正则表达式)====================")
print(match.re) # re.compile('(^a*)(c.*)#(XY)', re.IGNORECASE)
# 正则表达式搜索文本的开始位置
print("====================正则表达式搜索文本的开始位置====================")
print(match.pos)
# 正则表达式搜索文本的结束位置
print("====================正则表达式搜索文本的结束位置====================")
print(match.endpos)
# 待匹配的文本
print("====================待匹配的文本====================")
print(match.string)
# 匹配字符串在原始字符串的开始位置
print("====================匹配字符串在原始字符串的开始位置====================")
print(match.start())
# 匹配字符串在原始字符串的结束位置
print("====================匹配字符串在原始字符串的结束位置====================")
print(match.end())
# 匹配区域,返回(start(), end())
print("====================匹配区域,返回(start(), end())====================")
print(match.span())
# 获取匹配后的字符串
print("====================获取匹配后的字符串====================")
print(match.group())
# 获取每部分匹配的字符串,元祖类型
print("====================获取每部分匹配的字符串,元祖类型====================")
print(match.groups())