Python-正则表达式

正则匹配

匹配符号

'.',用于匹配除了换行符(/n)之外的所有符号

'^',行首,后面的匹配符号从字符串的开始进行匹配

'$',行尾,前面的匹配符号从字符串的末尾进行匹配

'*',*前面的字符匹配0次或多次(贪婪模式)

'+',+前面的字符匹配1次或多次(贪婪模式)

'?',?前面的字符匹配0次或1次(贪婪模式)

'*?,+?,??',上面三个的非贪婪模式

'{m,n}',前面的字符匹配m-n次(贪婪模式)

'{m,n}?',上面的非贪婪模式

'\\',\是转义字符,在特殊字符前加\,则标识字符本身

'[]',标识一组字符。如果是^开头则表示是补集(非)。如[a-z]标识a-z的字符,[^a-z]标识除了a-z的字母的其他字符

'|',或。如A|B,标识匹配A或B

'(...)',匹配括号内的正则表达式内容,后续可以在字符串中检索或匹配内容

'(?aiLmsux)', 为RE设置A、I、L、M、S、U或X标志。

'(?:...)',  常规括号的非分组版本。

'(?P<name>...)', 给分组自定义名称,分组匹配的子字符串可以通过名称访问。

'(?P=name)',    匹配名为name的组之前匹配的文本。

'(?#...)',  评论;忽略。

'(?=...)',  如果...匹配下一个,但不使用字符串。

'(?!...)',  如果...,下一个不匹配。

'(?<=...)', 如果前面有...(必须是固定长度)。

'(?<!...)', 如果前面没有...(必须是固定长度)。

'(?(id/name)yes|no)', 此正则一般用于前面已经划分了gourp的情况。id和name是gourp的id或者自定义名称。此处详解传送门

特殊字符

\number 匹配相同号码的组的内容

\A 仅在字符串开头匹配。

\Z 仅在字符串结尾匹配。

\b 匹配空字符串,但仅在单词的开头或结尾处匹配。

\B 匹配空字符串,但不匹配单词的开头或结尾。

\d 匹配任何十进制数字;相当于设置[0-9]的字节模式。

\D 匹配任何非数字字符;相当于[^\d]。

\s 匹配任何空白字符;相当于[\t\n\r\f\v]字节模式。

\S 匹配任何非空白字符;相当于[^\s]。

\w 匹配任何字母数字字符;相当于[a-zA-Z0-9_]。

\W 匹配\w的补码。

\\ 匹配一个反斜杠。

使用特殊字符时,本身特殊字符前的\也是需要转义的。或者直接使用r前缀,就不用考虑转义了。

import re

sample_string = 'abcd'
result1 = re.match('\\w+', sample_string)
result2 = re.match(r'\w+', sample_string)
print(result1)
print(result2)

---------------
输出:可以看到两种情况输出结果是一样的。
<re.Match object; span=(0, 4), match='abcd'>
<re.Match object; span=(0, 4), match='abcd'>

re模块

Python中re模块包含了所有正则表达式的功能。

方法

#re模块的方法
    match     将正则表达式模式与字符串开头匹配。
    fullmatch 将正则表达式模式与所有字符串匹配。
    search    在字符串中搜索是否存在模式。
    sub       按正则匹配出现的次数,替换字符串。
    subn      与sub相同,但也返回替换的数量。
    split     按模式的出现次数拆分字符串。
    findall   查找字符串中所有能匹配正则表的是的部分。
    finditer  返回一个迭代器,为每个匹配生成一个匹配对象。
    compile   将模式编译为模式对象。
    purge     清除正则表达式缓存。
    escape    将字符串中的所有非字母数字反斜杠。

match

因为match是从字符串开头匹配,所以从开头开始匹配字母是有结果的,从开头开始匹配数字得到的结果是空。

import re

sample_string = 'abcd1234321efgh'
result_letter = re.match('[a-z]*', sample_string)
result_number = re.match('[0-9]*', sample_string)
print("匹配字母:", result_letter.group())
print("匹配数字:", result_number.group())

--------------------------
输出:
匹配字母: abcd
匹配数字: 

fullmatch

fullmatch需要正则表达式匹配字符串的所有内容。如果正则表达式无法匹配字符串所有内容则返回None。

import re

sample_string = 'abcd1234321efgh'
result_letter = re.fullmatch('[a-z]*[0-9]*[a-z]*', sample_string)
result_number = re.fullmatch('[a-z]*[0-9]*', sample_string)
print("匹配:", result_letter.group())
print("匹配:", result_number)

--------------
输出:
匹配: abcd1234321efgh
匹配: None

search & findall

search只能根据正则表达式搜素到字符串内第一个匹配的内容。如果需要搜索字符串内所有匹配正则表达式的内容,则需要用findall。

import re

sample_string = 'abcd1234321efgh'
result_letter = re.search('[a-z]*', sample_string)
print("匹配字母:", result_letter.group())
result_letter = re.findall('[a-z]{4}', sample_string)
print("匹配字母:", result_letter)

------------------
输出:
匹配字母: abcd
匹配字母: ['abcd', 'efgh']

sub & subn

sub(pattern, repl, string, [count], [flags])

sub('正则匹配规则', '替换的字符串', '被替换的字符串', [定义替换的次数])

repl参数可以字符串也可以是一个可调用的函数,如果是可调用的函数,将会将正则表达式匹配的值转递给函数,并且函数必须返回需要替换的字符串

import re

def replace(repl):
    repl_new = repl.group() + '!'
    return repl_new

sample_string = 'liqi,test_example,com'

#普通替换字符串
result = re.sub('[,_]', '.', sample_string)
print("将字符串中,_替换成.", result)

#通过一个可调用的函数处理正则匹配到的值,返回新的需要替换的值。
result = re.sub('[,_]', replace, sample_string)
print("将字符串中,_追加!", result)

#subn和sub一样,但是多返回一个替换次数
result = re.subn('[,_]', '.', sample_string)
print(result)

---------------
输出:
将字符串中,_替换成.: liqi.test.example.com
将字符串中,_追加!: liqi,!test_!example,!com
('liqi.test.example.com', 3)

split

拆分字符串。优势:可以正则匹配多个值。

import re

sample_string = 'liqi,test_example,com'
result = re.split('[,_]', sample_string, 2)
print("拆分后:", result)

-----------------
输出:
拆分后: ['liqi', 'test', 'example,com']

正则匹配分组

(...)-分组示例

import re

sample_string = 'abcd1234321efgh'
result = re.match('([a-z]*)(\d*)', sample_string)
print("匹配字母:", result.group(1))
print("匹配数字:", result.group(2))

-------------------
输出:
匹配字母: abcd
匹配数字: 1234321

\number示例

import re

sample_string = '<html>hello world</html><xxx>'
result = re.match(r'<([a-z]+)>(\w+\s\w+)</\1>', sample_string)
print("标签:", result.group(1))
print("文本:", result.group(2))

---------------
输出:
标签: html
文本: hello world

(?P<name>...) & (?P=name)-给分组自定义命名示例

import re

sample_string = '<html>hello world</html><xxx>'
result = re.match(r'<(?P<mygroup>[a-z]+)>(?P<wordgroup>\w+\s\w+)</(?P=mygroup)>', sample_string)
print("标签:", result.group('mygroup'))
print("文本:", result.group('wordgroup'))

-----------------
输出:
标签: html
文本: hello world

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值