python的re模块

本文详细介绍了Python中正则表达式的使用方法,包括常见元字符的功能解释及re模块的各种API接口的应用,如查找、替换等操作。

正则表达式是我们日常编程经常使用到的,运用检索或替换字符串中匹配的子串。对于python语言来说,已有基础的正则表达式模块(即re模块),当然还有其它第三方的正则表达式模块,通常第三方的正则表达式模块也包含re模块中实现的所有API接口。

在我们解释API之前,我们先简单了解python的正则表达式的写法:

. 在默认模式下,它匹配除换行符之外的任何字符。如果DOTALL已指定该标志,则匹配包括换行符在内的任何字符。
^ 匹配字符串的开头,并且在MULTILINE模式下也会在每个换行符后立即匹配。
$ 匹配字符串的结尾或在字符串末尾的换行符之前,并且在MULTILINE模式中也匹配换行符之前。 foo 匹配'foo'和'foobar',而正则表达式foo$只匹配'foo'。更有趣的是, 通常foo.$在'foo1\nfoo2\n'匹配'foo2'中搜索,但在MULTILINE模式中搜索'foo1' ; 搜索单个$in 'foo\n'将找到两个(空)匹配:一个在换行符之前,一个在字符串末尾。
* 使得到的RE匹配前面RE的0或更多次重复,尽可能多的重复。 ab*将匹配'a','ab'或'a',后跟任意数量的'b'。
+ 使得到的RE匹配前一个RE的1次或更多次重复。 ab+将匹配'a',后跟任何非零数字的'b'; 它不会只匹配'a'。
? 使得到的RE匹配前面RE的0或1次重??复。 ab?将匹配'a'或'ab'。
*?,+?,?? 的'*','+'和'?'预选赛都是贪婪的 ; 它们匹配尽可能多的文本。有时这种行为是不可取的; 如果RE <.*>匹配,它将匹配整个字符串,而不仅仅是。在限定符之后添加使其以非贪婪或最小的方式执行匹配; 尽可能少的 字符将匹配。使用RE 仅匹配。'<a> b <c>''<a>'?<.*?>'<a>'
{m} 指定应匹配前一个RE的m个副本; 较少的匹配导致整个RE不匹配。例如,a{6}将匹配正好六个'a'字符,但不匹配五个字符。
{m,n}  使得到的RE匹配前一个RE的m到n次重复,尝试匹配尽可能多的重复。例如, a{3,5}将匹配3到5个'a'字符。省略m指定零的下限,省略n指定无限上限。作为一个例子,a{4,}b将匹配'aaaab'或一千个'a'字符后跟一个'b',但不是'aaab'。可以不省略逗号,或者将修饰符与先前描述的形式混淆。
{m,n}? 使得到的RE匹配前一个RE的m到n次重复,尝试匹配尽可能少的重复。这是前一个限定符的非贪婪版本。例如,在6个字符的字符串上'aaaaaa',a{3,5}将匹配5个'a'字符,而a{3,5}?只匹配3个字符。
要么转义特殊字符(允许你匹配像'*','?'等等那样的字符 ),要么发出特殊序列的信号; 下面讨论特殊序列。如果你没有使用原始字符串来表达模式,请记住Python也使用反斜杠作为字符串文字中的转义序列; 如果Python的解析器无法识别转义序列,则反斜杠和后续字符将包含在结果字符串中。但是,如果Python会识别结果序列,则反斜杠应重复两次。这很复杂且难以理解,因此强烈建议您使用原始字符串,除了最简单的表达式。

下面我们逐个了解re模块中所有的API接口的使用:

1)、compile(pattern, flags=0)
编译一个正则表达式模式,返回一个模式对象。此主要达配其他函数使用

2)、split(pattern, string, maxsplit=0, flags=0)
通过模式,分割成若干个字符串,并以链表形式返回
3)、escape(pattern)
转义除ASCII字母、数字和'_'之外的所有字符。

4)、findall(pattern, string, flags=0)
 返回字符串中所有非重叠匹配的列表。如果模式中存在一个或多个捕获组,则返回元组的列表;如果是模式,这将是一个元组列表有多个组。结果中包含空匹配项。
    
5)、finditer(pattern, string, flags=0)
返回一个迭代器,遍历字符串。对于每个匹配,迭代器返回一个匹配对象。结果中包含空匹配项。
    
6)、fullmatch(pattern, string, flags=0)
返回一个迭代器,遍历字符串。对于每个匹配,迭代器返回一个匹配对象。结果中包含空匹配项。
    
7)、match(pattern, string, flags=0)
尝试在字符串的开头应用模式,返回匹配对象,如果没有找到匹配,则为None。
    
8)、purge()
清除正则表达式缓存    
9)、search(pattern, string, flags=0)
在字符串中搜索匹配的模式,返回匹配对象,如果没有找到匹配,则为None。
    
10)、sub(pattern, repl, string, count=0, flags=0)
返回替换最左边所获得的字符串不重叠的模式在字符串中的出现替换repl。repl可以是字符串也可以是可调用的;如果一个字符串,反斜杠转义将被处理。如果它是一个可调用的,它通过了匹配对象并且必须返回。要使用的替换字符串。
    
11)、subn(pattern, repl, string, count=0, flags=0)
返回一个包含(new_string, number)的2元组。new_string是通过替换最左边得到的字符串源中模式的不重叠出现用替换的repl字符串。数字是替换。repl可以是字符串也可以是a可调用的;如果一个字符串,反斜杠转义将被处理。如果它是可调用的,它将通过匹配对象并必须。返回要使用的替换字符串。
    
12)、template(pattern, flags=0)

编译一个模板模式,返回一个模式对象

### Python `re` 模块使用指南 #### 什么是正则表达式? 正则表达式是一种用于匹配字符串的强有力的工具,它允许用户定义一系列规则来描述目标字符串的特征。Python 的 `re` 模块提供了一个接口,使开发人员能够轻松地利用正则表达式的强大功能[^1]。 #### 基本用法 以下是 `re` 模块的一些基本函数及其用途: 1. **`re.match(pattern, string)`** - 尝试从字符串的起始位置匹配一个模式。如果匹配成功,则返回匹配对象;否则返回 None。 ```python import re result = re.match(r'\d+', '123abc') if result: print(result.group()) # 输出: 123 ``` 2. **`re.search(pattern, string)`** - 扫描整个字符串并返回第一个成功的匹配项。如果没有找到匹配项,则返回 None。 ```python result = re.search(r'[a-z]+', '123ABCdef456') if result: print(result.group()) # 输出: def ``` 3. **`re.findall(pattern, string)`** - 返回字符串中所有非重叠匹配的列表。 ```python matches = re.findall(r'\d+', 'abc123def456ghi789') print(matches) # 输出: ['123', '456', '789'] ``` 4. **`re.sub(pattern, repl, string)`** - 替换字符串中所有与模式匹配的部分为指定的内容。 ```python new_string = re.sub(r'\s+', '-', 'Hello world!') print(new_string) # 输出: Hello-world! ``` #### 编译正则表达式 为了提高性能,在多次使用同一个正则表达式时,建议先将其编译成正则表达式对象。 ```python pattern = re.compile(r'^\w+$') # 匹配由字母、数字或下划线组成的单词 result = pattern.match('hello_world') if result: print("Matched!") else: print("No match.") ``` #### 标志位 标志位可以改变正则表达式的行为方式。常用的标志有: - `re.IGNORECASE`: 不区分大小写匹配[^3]。 - `re.MULTILINE`: 多行模式,影响 ^ 和 $ 的行为。 - `re.DOTALL`: 让 . 特殊字符匹配包括换行符在内的任意字符。 - `re.DEBUG`: 显示关于正则表达式结构的信息,主要用于调试目的[^3]。 #### 实际案例分析 假设我们需要验证电子邮件地址的有效性,可以编写如下代码: ```python email_pattern = r'^[\w.-]+@[\w.-]+\.\w+$' emails = ["test@example.com", "invalid-email@", "another.test@example.co.uk"] for email in emails: if re.fullmatch(email_pattern, email): print(f"{email} 是有效的邮件地址") else: print(f"{email} 是无效的邮件地址") ``` #### 进阶技巧 对于更复杂的情况,比如提取网页中的链接或者解析日志文件,可能需要用到分组捕获等功能。下面是一个简单的例子展示如何获取 URL 地址中的主机名部分: ```python url = "http://www.example.com/path/to/resource?query=string" hostname_pattern = r'https?://([^/?#]+)' match = re.search(hostname_pattern, url) if match: hostname = match.group(1) print(f"Hostname extracted from URL: {hostname}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值