1. 通用正则表达式
| 标识 | 含义 | 范围 |
|---|---|---|
| \d | 任何数字 | [0-9] |
| \D | 不是数字 | |
| \s | 任何空白字符 | [\t\n\r\f\v] |
| \S | 空白字符以外 | |
| \w | 任何大小写字母,数字和_ | [0-9a-zA-Z_] |
| \W | 非\w | |
| \b | 匹配任何一个单词边界 | 比如er\b可以匹配到never,但是不能匹配到verb |
| \B | 匹配非单词边界 | 比如er\B可以匹配到verb,但是不能匹配到verb |
| \ | 强制匹配\ | |
| . | 匹配任何字符(除了\n) | |
| ? | 前面的模式可有可无 | |
| * | 零次或无数次 | |
| + | 1次或无数次 | |
| {n,m} | 重复n-m次 | |
| {n} | 重复n次 | |
| +? | 非贪婪,最小方式匹配+ | |
| *? | 非贪婪,最小匹配方式* | |
| ?? | 非贪婪,最小匹配方式? | |
| ?= | 正向前瞻 | 自身不占字符位,只是用来断言后面一个字符是特定字符,比如c(?=\d),这样的正则会匹配到类似于c1, c2,而不能匹配ca, cc这样的字符 |
| ?! | 负向前瞻 | 自身不占字符位,只是用来断言后面一个字符不能是特定字符,比如(?!:).*,表示后面可以是除了\n以外的任何字符,但是不能是: |
| ^ | 匹配每一行的开头,在re.M下,每行开头都匹配 | |
| $ | 匹配一行结尾,在re.M下,每行结尾都匹配 | |
| \A | 匹配最开始,在re.M下,从文本最开始匹配 | |
| \B | 匹配最结尾,在re.M下,从文本最结尾匹配 |
2. 常用函数
2.1 search
扫描查找整个字符串,找到第一个模式匹配的
import re
def re_search(str, re_relu):
matched = re.search(re_relu, str)
print(matched.span())
print(matched.group())
if __name__ == '__main__':
re_rule = r'\w+?@\w+?\.com'
str = 'my email is abc_ff@163.com'
re_search(str, re_rule)
2.2 match
从字符的最开头开始匹配,找到的第一个模式匹配的即实用re.M多行撇皮,也就是从最开头进行匹配
import re
def re_match(str, re_relu):
matched = re.match(r'^m[\w+?\s+?]+@', str)
print(matched)
if __name__ == '__main__':
re_rule = r'\w+?@\w+?\.com'
str = 'my email is abc_ff@163.com'
re_match(str, re_rule)
2.3 findall
返回一个不重复的pattern的匹配列表
def re_findall(str, re_relu):
ptn1 = re.findall(re_relu, str)
print(ptn1)
if __name__ == '__main__':
re_rule = r'r[au]n'
str = 'I run to you, you ran to him!'
re_findall(str, re_rule)
2.4 finditer
和findall类似,只不过是实用迭代器的方式
def re_findall(str, re_relu):
ptns = re.findall(re_relu, str)
for ptn in ptns:
print(ptn)
if __name__ == '__main__':
re_rule = r'r[au]n'
str = 'I run to you, you ran to him!'
re_findall(str, re_rule)
2.5 split
用正则表达式分开字符串
def re_split(str, re_relu):
strs = re.split(re_relu, str)
print(strs)
if __name__ == '__main__':
re_rule = r'r[au]n'
str = 'I run to you, you ran to him!'
re_split(str, re_rule)
2.6 sub
使用正则替换字符
def re_sub(str, re_relu):
sub_str = 'jump'
new_str = re.sub(re_relu, sub_str, str)
print(new_str)
if __name__ == '__main__':
re_rule = r'r[au]n'
str = 'I run to you, you ran to him!'
re_sub(str, re_rule)
'''
output:
'I jump to you, you jump to him!'
'''
2.7 subn
和sub类似,但是额外返回一个替换的次数
re_subn(str, re_relu):
sub_str = 'jump'
new_str = re.subn(re_relu, sub_str, str)
print(new_str)
if __name__ == '__main__':
re_rule = r'r[au]n'
str = 'I run to you, you ran to him!'
re_subn(str, re_rule)
'''
output:
('I jump to you, you jump to him!', 2)
'''