正则表达式 []
正则表达式,也叫正则式、规则表达式、模式匹配表达式,是一个用来匹配文本中某些模式的字符串。
在编程中,使用正则表达式可以进行字符串的匹配、替换、查找和分割等操作,是非常实用的工具。
正则表达式的基本语法
正则表达式由普通字符和特殊字符构成,通常用来匹配字符串。其中最基本的规则是,普通字符可以匹配其本身,而特殊字符则有特殊含义。
- 点号(.):匹配任意单个字符,但是不包括新行符。
- 分支条件(|):匹配两种条件中的一个。
- 方括号([]):匹配方括号中的任意一个字符。
- 贪婪模式(*):匹配任意数量的相邻字符。
- 非贪婪模式(*?):匹配尽可能少的字符。
- 重复次数({m,n}):指定匹配重复次数。
- 反向引用(\n):匹配前面的第n个捕获组。
示例代码:
import re
pattern = r'H.*o'
text1 = 'Hello, world!'
text2 = 'Hi, there! How are you doing?'
result1 = re.findall(pattern, text1)
result2 = re.findall(pattern, text2)
print(result1) # ['Hello']
print(result2) # ['Hi', 'How']
在上面的代码中,我们使用了re模块中的findall方法,来查找符合正则表达式模式的字符串。这里的模式是以’H’开头,以’o’结尾,中间是任意数量的字符。因此,我们可以在text1和text2中分别找到一个符合条件的字符串。
正则表达式的高级应用
在实际使用中,正则表达式还有一些高级特性,可以更加灵活地匹配字符串。
- 零宽断言((?=pattern)):匹配符合pattern的字符串,但是不包括其本身。
- 针对词边界(\b):匹配单词的开始或结束。
- 前后环绕匹配((?<=pattern)和(?<!pattern)):只匹配符合pattern的字符串前/后的内容,而不包括pattern本身。
- 直接捕获组((pattern)):可以直接捕获pattern的内容。
示例代码:
import re
text = 'Hello, world! This is a test.'
pattern1 = r'(?<=, )[a-z]*'
pattern2 = r'\b[a-z]*\b'
pattern3 = r'(Hello), ([a-z]+)!'
result1 = re.findall(pattern1, text)
result2 = re.findall(pattern2, text)
result3 = re.findall(pattern3, text)
print(result1) # ['world']
print(result2) # ['is', 'a', 'test']
print(result3) # [('Hello', 'world')]
在上面的代码中,我们分别使用了零宽断言、词边界和直接捕获组来匹配字符串。其中第一个模式匹配以逗号加空格开头的小写字母单词,第二个模式匹配单词,第三个模式匹配以’Hello’开头,以叹号结尾,并且中间有任意数量的小写字母词语。
正则表达式的实用技巧
在实际使用中,正则表达式可以帮助我们快速解决很多问题,特别是在文本处理方面。
以下是一些常用的正则表达式实用技巧:
- 匹配URL
import re
text = 'Visit my website at https://www.example.com. Or check out my blog at http://www.example.com/blog.'
pattern = r'https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+'
result = re.findall(pattern, text)
print(result) # ['https://www.example.com', 'http://www.example.com/blog']
该模式可以匹配http或https协议的URL链接,包括子域名和路径。
- 匹配Email地址
import re
text = 'Contact us at contact@example.com or info@example.com.cn.'
pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
result = re.findall(pattern, text)
print(result) # ['contact@example.com', 'info@example.com.cn']
该模式可以匹配常见的Email地址,包括多级域名。
- 匹配电话号码
import re
text = 'My phone number is 123-4567-8901. Or you can reach me at (123) 456-7890.'
pattern = r'(\d{3})-(\d{4})-(\d{4})|\((\d{3})\)\s*(\d{3})-(\d{4})'
result = re.findall(pattern, text)
print(result) # [('123', '4567', '8901', '', '123', '456-7890')]
该模式可以匹配常见的电话号码格式,包括带括号和不带括号的格式。
结论
正则表达式是一项非常实用的技能,掌握了正则表达式,可以帮助我们更快速地处理文本数据。
需要注意的是,正则表达式语法较为复杂,需要反复练习和实践才能掌握。当然,也可以通过在线工具或正则表达式软件来辅助学习和调试。