pythonre模块
正式的表达基础
pythonre模块为处理字符串匹配、搜索、替换等操作提供了丰富的API。一般来说,正则表达式是在字符串中发现特定模式的超级工具。先举一个基本的例子,如果我们需要检查一个字符串是否是有效的电子邮件地址:
import re email_pattern = r'^[w.-]+@[w.-]+.[a-zA-Z]{2,6}$' sample_email = 'test@example.com' if re.match(email_pattern, sample_email): print(有效的电子邮件地址') else: print(“无效电子邮件地址”)
常用的函数解析
典型的pythonre模块函数包括match、search、findall、sub、split等。每一个函数都有其独特的使用场景:
- re.match():试着将字符串的起始位置与模式相匹配,如果起始位置没有成功匹配,match()返回none。
- re.search():首先出现在整个字符串中寻找模式,而不仅限于起始位置。
- re.findall():找出所有匹配模式的子串,并以列表的形式返回。
- re.sub():在字符串中替换匹配项目。
- re.split():根据匹配模式将字符串划分为列表。
下面是使用findall和sub函数的代码示例:
import re text = "找出所有数字:12, 34, 56, 78。" numbers = re.findall(r'd+', text) print(“数字列表:”, numbers) text_with_replacement = re.sub(r'd+', '[数字]', text) print(“替换数字后的文本:” text_with_replacement)
正式的表达模式
在编写正则表达式时,使用特殊的字符和序列来表达我们需要匹配的模式:
- d:与任何数字相匹配。
- w:匹配字母,数字或下划线。
- s:与任何空白字符匹配(例如空格,Tab)。
- .:与任何字符匹配,除了换行符。
- *:与前面的子表达式相匹配零次或多次。
- +:与之前的子表达式相匹配一次或多次。
- ?:与之前的子表达式相匹配零次或一次。
- [...]:表示一组字符,例如[amk]匹配'a'、'm'或'k'。
- (...):标记子表达式的开始和结束位置。
让我们看看如何使用这些模式:
import re message = “我的电话号码是:(010)88888,我的电子邮件是:contact@example.com。" phone_pattern = r[0-9]{3}[0-9]{8}'[[0-9] email_pattern = r'[w.-]+@[w.-]+.[a-zA-Z]{2,6}' phone_numbers = re.findall(phone_pattern, message) emails = re.findall(email_pattern, message) print(“电话号码:”, phone_numbers) print(“电子邮件:”, emails)
分组和捕获
分组是正则表达中非常强大的特征,它允许我们从匹配的文本中提取我们感兴趣的部分。例如,我们应该从日志文件中提取日期和时间:
import re log_entry = "2023-03-15 10:08:24, INFO: Job started." date_time_pattern = r'(d{4}-d{2}-d{2}) (d{2}:d{2}:d{2})' match = re.search(date_time_pattern, log_entry) if match: date, time = match.groups() print("日期:", date) print(“时间:”, time)
编译正则表达式
如果一个正则表达式需要多次使用,可以先编译成正则表达式对象。这样可以提高效率,尤其是在进行大量匹配时:
import re pattern = re.compile(r'd+') matches = pattern.findall('12 drummers drumming, 11 pipers piping, 10 lords a-leaping') print("所有数字:"," matches)
贪婪模式和非贪婪模式
默认情况下,正则表达式是“贪婪”的,这意味着当有多种匹配的可能性时,它会尽可能匹配最长的字符串。而非贪婪模式会尽可能匹配最短的字符串。在量词后面添加?可以实现非贪婪匹配:
import re greedy_html_tag = re.compile(r'<.*>') nongreedy_html_tag = re.compile(r'<.*?>') text = '<div>Simple div</div>' greedy_match = greedy_html_tag.search(text) nongreedy_match = nongreedy_html_tag.search(text) print(“贪婪匹配:” greedy_match.group()) print(“非贪婪匹配:” nongreedy_match.group())
通过掌握pythonre模块的使用,我们可以在字符的海洋中找到我们需要的珍珠。正则表达式是提高工作效率的利器,无论是数据清洁、日志分析还是复杂的文本处理任务。