正则表达式
符号 |
|
|
literal |
匹配文本字符串的字面值literal |
foo |
re1|re2 |
匹配正则表达式re1或re2 |
foo|bar |
. |
匹配任何字符(除了\n) |
b.b |
^ |
匹配字符串起始部分 |
^Dear |
$ |
匹配字符串终止部分 |
/bin/sh$ |
* |
匹配0次或多次前面出现正则表达式 |
[A-Za-Z0-9]* |
+ |
匹配1次或多次 |
[A-Z]+ |
? |
匹配0次或1次 |
[A-Z]? |
{N} |
匹配N次前面出现正则表达式 |
[0-9]{N} |
{N,M} |
|
|
[...] |
字符集 |
[aeiou] |
[x-y] |
匹配x-y范围内任意一字符 |
[0-9] |
[^...] |
不匹配此字符集任意一个字符 |
[^aeiou] |
特殊字符 |
|
|
\d |
匹配0-9 |
data\d+.txt |
\w |
|
|
\s |
|
|
扩展表示法 |
|
|
使用择一匹配符号匹配多个正则表达式模式
p匹配任意单字符(.)除了\n
换行
从字符串起始或者结尾或者单词边界匹配
^From |
任何以From作为起始字符串 |
/bin/tcsh$ |
任何以/bin/tcsh结尾字符串 |
^Subject:hi$ |
任何由单独字符串Subject:hi构成字符串 |
the |
匹配the |
\bthe |
任何以the开始字符串 |
\bthe\b |
仅仅匹配单词the |
Bthe |
任何包含但并不以the作为起始字符串 |
创建字符集合
限定范围和否定
使用闭包操作符实现存在性和频数匹配
表示字符集的特殊字符
使用圆括号指定分组
扩展表示法
正则表达式和python语言
re模块:核心函数和方法
`compile(pattern,flag=0)` 返回正则表达式对象。
- re模块函数和正则表达式对象方法
match(pattern,string,flags=0)
匹配成功返回匹配对象,失败返回None
search(pattern,string,flags=0)
findall(pattern,string[,flags])
返回一个匹配列表
finditer(pattern,string[,flags])
与findall 相同返回一个迭代器,迭代器返回一个匹配对象
split(pattern,string,max=0)
正则表达式模式分隔符,将字符串分割为列表,返回成功匹配列表
- re模块函数和正则表达式对象方法
sub(pattern,repl,string,count=0)
- 常用匹配对象方法
import re
r = re.compile('foo') #返回正则表达式对象
m = re.match(r,'foo') #模式匹配对象
if m is not None:
print(m.group())
m = re.match(r,'food on the table foo')
if m is not None:
print(m.group())
使用search()在一个字符串中查找模式(搜索与匹配对比)
m = re.match('foo','seafood') #匹配失败
m = re.search('foo','seafood') #匹配成功
重复,特殊字符及其分组
- 简单电子邮件正则表达式
\w+@\w+\.com
---> yujun@qq.com
\w+@(\w+\.)?\w+\.com
--->yujun@qq.com yujun@www.qq.com
\w+@(\w+\.)*\w+\.com
---->nobody@www.xxx.yyy.zzz.com
- 匹配能够提取内容
m = re.match(‘(a)(b)‘,‘ab‘)
print(m.group()) #ab
print(m.group(1)) #a
print(m.group(2)) #b
print(m.groups()) #(‘a‘,‘b‘)
m = re.match('(\w\w\w)-(\d\d\d)','abc-123')
print(m.group()) #'abc-123'
print(m.group(1)) #子组1 'abc'
print(m.group(2)) #子组2 '123'
print(m.groups()) #('123','abc')
re模块方法 findall() sub() subn() split()
- 使用findall() fiditer()查找每一次出现位置
re.findall('car','car') # ['car']
re.findall('car','scray') #['car']
re.findall('car','carry the barcard to the car') #['car','car','car']
s = 'That and this'
print(re.findall(r'(th\w+)',s,re.I)) #['This','that]
it = re.finditer(r'(th\w+)',s,re.I)
g = next(it)
print(g.groups()) #('This',)
g = next(it)
print(g.groups()) #('that')
print(g.group(1)) #that
使用sub()和subn()搜索与替换
print(re.sub('[ae]','X','abcedf')) #XbcXdf
print(re.subn('[ae]','X','abcedf')) #('XbcXdf', 2)
# 可以用n来代替分组编号 MM/DD/YY --> DD/MM/YY
print(re.sub(r'(\d{1,2})/(\d{1,2})/(\d{2}|d{4})',r'\2/\1/\3','2/20/91')) #20/2/91
在限定模式上使用splite()分割字符串
print(re.split(':','str1:str2:str3')) #['str1','str2','str3']
扩展符号
正则表达式入门
正则表达式目的
- 判断字符串是否符合正则表达式逻辑
- 通过正则表达式从指定的字符串中获取我们需要的特定部分。
#手机号码特征 13[\d]{9}
print(re.match(r'13[\d]{9}','13362158971').group())
match方法
. |
匹配任意一个字符除了\n |
print(re.match(‘.‘,‘你好‘).group()) #你 |
[] |
匹配[]中列举一个字符 |
|
\d |
|
|
\D |
|
|
\s |
空白字符 |
|
\S |
|
|
\w |
|
|
\W |
|
|
正则表达式描述数量
* |
匹配前一个字符出现0次或者无限次 |
+ |
|
? |
|
{m} |
|
{m,} |
|
{m,n} |
|
s = '\\nabc'
print(re.match('\\\\nabc',s)) #\\nabc
print(re.match(r'\\nabc',s)) #<_sre.SRE_Match object; span=(0, 5), match='\\nabc'>
表示边界
$ |
re.match(r‘1[3]\d{9}$‘,‘13888888888‘) |
^ |
match感觉不出来,findall(),search() |
b |
|
B |
|
正则分组
|
|
(ab) |
将括号中字符作为一个分组 |
\num |
引用分组num匹配到的字符串 |
正则表达式
原文:https://www.cnblogs.com/hzyujun/p/12286380.html