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}$'
posted @ 2019-11-20 23:26  rustling  阅读(145)  评论(0编辑  收藏  举报