Python正则表达式
正则表达式(regular expression)是一种强大的字符串匹配工具。可通过使用特定的字符模式进行搜索、替换等操作。
1. 匹配模式
\d # 数字: [0-9]
\D # 非数字: [^\d]
\s # 空白字符: [<空格>\t\r\n\f\v]
\S # 非空白字符: [^ls]
\w # 单词字符: [A-Za-z0-9_]
\W # 非单词字符: [^\w]
. # 匹配任意字符
* # 匹配前一个字符0或无限次
+ # 匹配前一个字符1次或无限次
? # 匹配前一个字符0次或1次
{n} # 匹配前一个字符n次
{n,m} # 匹配前一个字符n至m次
^ # 匹配字符串开头,在多行模式中匹配每一行的开头
$ # 匹配字符串末尾,在多行模式中匹配每一行的末尾
\ # 转义字符
| # 匹配左右表达式任意一个,先匹配左边,匹配成功后跳过右边
() # 被括起来的表达式作为分组
[] # 字符集
2. python的re模块
1. re.match()
re.match()
用于从字符串的起始位置匹配正则表达式。如果开头不匹配,返回 None
。
re.match(pattern, string, flags=0)
import re
m = re.match(r'hello', 'hello world!')
print(m.group()) # 输出"hello"
2. re.search()
re.search()
用于在字符串中搜索匹配正则表达式的模式。如果找到匹配,返回一个 Match 对象;否则返回 None
。
re.search(pattern, string, flags=0)
m = re.search(r'world', 'hello world!')
print(m.group()) # 输出"world"
3. re.findall()
re.findall()
以字符串列表返回所有匹配项。
re.findall(pattern, string, flags=0)
pattern = r'\d+'
text = 'There are 3 apples, 5 bananas, and 12 oranges.'
m = re.findall(pattern, text)
print(m) # 输出"['3', '5', '12']"
4. re.finditer()
re.finditer()
返回一个迭代器,生成匹配对象。
re.finditer(pattern, string, flags=0)
pattern = r'\d+'
text = 'There are 3 apples, 5 bananas, and 12 oranges.'
m = re.finditer(pattern, text)
for i in m:
print(i.group(), end=" ") # 输出"3 5 12"
5. 分组group()
通过在正则表达式中使用括号 ()
,可以获取分组。
- group(0)或group():获取整个匹配的内容。
- group(1):获取第一个分组的内容。
- group(2):获取第二个分组的内容。
pattern = r'(\d+) apples and (\d+)'
text = 'There are 3 apples and 5 bananas.'
m = re.search(pattern, text)
if m:
print(m.group()) # 输出“3 apples and 5”
print(m.group(1)) # 输出“3”
print(m.group(2)) # 输出“5”
6. re.sub()
re.sub()
用于替换字符串中的匹配项。
re.sub(pattern, repl, string, count=0, flags=0)
pattern = r'\d+'
replacement = '#'
text = 'There are 3 apples, 5 bananas, and 12 oranges.'
result = re.sub(pattern, replacement, text)
print(result) # 输出"There are # apples, # bananas, and # oranges."
7. re.split()
re.split()
根据匹配项分割字符串。
re.split(pattern, string, maxsplit=0, flags=0)
# 使用空白字符分割字符串
print(re.split(r'\s+', 'abc 123 abc'))
# 输出"['abc', '123', 'abc']"
8. re.compile()
re.compile()
用于将正则表达式模式编译成一个正则表达式对象。
p = re.compile(r'\d+')
text = 'There are 3 apples, 5 bananas, and 12 oranges.'
m = p.search(text)
print(m.group())
贪婪匹配
正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符
加个?
就可以让\d+
采用非贪婪匹配
text = "abc123abc "
# 贪婪匹配,会匹配尽可能多的 '\d'
greedy = re.search(r"\d+", text)
print(greedy.group()) # 输出 '123'
# 非贪婪匹配,使用 ? 或 {m,n}? 来实现
non_greedy = re.search(r"\d+?", text)
print(non_greedy.group()) # 输出 '1'
常用正则表达式
# 匹配任何非空字符
pattern=r'[^\s]'
# IP地址
pattern=r'^(((2[0-4]\d)|(25[0-5])|([01]?\d\d?))\.){3}((2[0-4]\d)|(25[0-5])|([01]?\d\d?))$'
# email邮箱
pattern=r'^[A-Za-z\d]+([-_.][A-Za-z\d]+)*@([A-Za-z\d]+[-.])+[A-Za-z\d]{2,4}$'