正则表达式的总结
@(作者:朝天椒)
文章目录
- 正则表达式的总结
- 正则表达式介绍
- 正则表达式的基本语法
- 常用正则表达式骚操作总结
- 相关例子
- python中正则表达式的使用
正则表达式介绍
- 正则表达式是从左到右来匹配一个字符串的。“Regular Expression” 这个词太长了,我们通常使用它的缩写 “regex” 或者 “regexp”。
正则表达式可以被用来替换字符串中的文本、验证表单、基于模式匹配从一个字符串中提取字符串等等。
正则表达式的基本语法
- 元字符是正则表达式的基本组成元素。元字符在这里跟它通常表达的意思不一样,而是以某种特殊的含义去解释。有些元字符写在方括号内的时候有特殊含义。
元字符如下:
元字符 | 描述 |
^ | 匹配行的开始 |
$ | 匹配行的结束 |
. | 匹配除换行符以外的任意字符。 |
[ ] | 字符类,匹配方括号中包含的任意字符,[amk] 匹配 ‘a’,‘m’或’k’ |
[^ ] | 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。 |
* | 匹配前面的子表达式零次或多次 |
+ | 匹配前面的子表达式一次或多次 |
? | 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。 |
{n,m} | 花括号,匹配前面字符至少 n 次,但是不超过 m 次。 |
(xyz) | 字符组,按照确切的顺序匹配字符xyz。 |
| | 分支结构,a|b匹配a或b |
\ | 转义符,它可以还原元字符原来的含义,允许你匹配保留字符 |
\w | 匹配所有字母和数字的字符: |
\W | 匹配非字母和数字的字符: |
\d | 匹配数字: |
\D | 匹配非数字: |
\s | 匹配空格符: |
\S | 匹配非空格符: |
\u4e00-\u9fa5 | 汉字的unicode范围 |
\u0030-\u0039 | 数字的unicode范围 |
\u0041-\u005a | 大写字母unicode范围 |
\u0061-\u007a | 小写字母unicode范围 |
常用正则表达式骚操作总结
- 正整数:
^\d+$
- 负整数:
^-\d+$
- 电话号码:
^+?[\d\s]{3,}$
- 电话代码:
^+?[\d\s]+(?[\d\s]{10,}$
- 整数:
^-?\d+$
- 用户名:
^[\w\d_.]{4,16}$
- 字母数字字符:
^[a-zA-Z0-9]*$
- 带空格的字母数字字符:
^[a-zA-Z0-9 ]*$
- 密码:
^(?=^.{6,}$)((?=.*[A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z]))^.*$
- 电子邮件:
^([a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4})*$
- IPv4 地址:
^((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))*$
- 小写字母:
^([a-z])*$
- 大写字母:
^([A-Z])*$
- 网址:
^(((http|https|ftp):\/\/)?([[a-zA-Z0-9]\-\.])+(\.)([[a-zA-Z0-9]]){2,4}([[a-zA-Z0-9]\/+=%&_\.~?\-]*))*$
- VISA 信用卡号码:
^(4[0-9]{12}(?:[0-9]{3})?)*$
- 日期 (MM/DD/YYYY):
^(0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])[- /.](19|20)?[0-9]{2}$
- 日期 (YYYY/MM/DD):
^(19|20)?[0-9]{2}[- /.](0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])$
- 万事达信用卡号码:
^(5[1-5][0-9]{14})*$
- 匹配所有的中文:
[a-zA-Z0-9’!"#$%&\'()*+,-./:;<=>?@,。?★、…【】《》?± “”‘’![\\]^_
{|}~]` - 通过unicode编码进行汉字筛选: [^\u4e00-\u9fa5\u0030-\u0039\u0041-\u005a\u0061-\u007a],匹配所有的非汉字,数组以及字母(可以理解为所有的特殊符号)
#去除特殊字符,只保留汉子,字母、数字
import re
string = "123我123456abcdefgABCVDFF?/ ,。,.:;:''';'''[]{}()()《》"
print(string)
123我123456abcdefgABCVDFF?/ ,。,.:;:''';'''[]{}()()《》
sub_str = re.sub(u"([^\u4e00-\u9fa5\u0030-\u0039\u0041-\u005a\u0061-\u007a])","",string)
print(sub_str)
123我123456abcdefgABCVDFF
# 这里要切记的是,如果为python2的话一定需要注意编码
sub_str = re.sub(u"([^\u4e00-\u9fa5\u0030-\u0039\u0041-\u005a\u0061-\u007a])","",string.decode('utf-8')
# 还可以将一些特殊的字符保留
# 比如保留汉字,字母和数字
r1 = [^\u4e00-\u9fa5\u0030-\u0039\u0041-\u005a\u0061-\u007a:]
# re.search的使用方法,具体如下所示, 这些括号和分隔符号一定要注意
filter_re = "(多少|什么|哪里|怎么|哪|价格|吗|方法|价|使用|大全|过程| \
怎样|介绍|原理|分类|哪个|价位|原因|行情|最佳|多长|简介| \
简介|用途|应用|区别|作用|型号|配方|大全|排名|步骤|及|注意| \
步骤|官网|适用|概述|好坏|排行|方案|优缺|公式|最|技术|与| \
现状|如何|好不好|作用|优点|定义|组成|特点|标准|几|方式|还是| \
成分|尺寸|作用|报价|查询|牌号|怎样|原料|特点|常见|工艺|对比| \
种类|意义|关系|比较|结构|搭配|规范|教程|特性|禁忌|知识|误区| \
是否|品牌|制作|发展|有何|图解|多久|设计)"
df_all['query'] = df_all['query'].astype(str)
df_all['all_flag'] = df_all['query'].apply(lambda x: 1 if re.search(filter_re, x) else 0)
相关例子
- 对上述文字删除特殊字符:{“status”:0,“version”:“1.0.0”,“results”:[{“retcode”:0,“word”:"鎸栨帢鏈烘寲鎺樻満椹鹃┒寮忓洓涓嶅儚闅忚溅鎸栨帢鏈虹粏鑺傝鏄庤疆寮忛殢杞︽寲鏈虹敓浜у巶瀹跺伐鍘傜洿钀�,“vec”
response = re.sub(r'word\":(.*?),\"vec')
- 英文句号
.
是元字符的最简单的例子。元字符.
可以匹配任意单个字符。它不会匹配换行符和新行的字符。例如正则表达式.ar
,表示: 任意字符后面跟着一个字母a
,
再后面跟着一个字母r
。
".ar" => The car parked in the garage.
- 字符集也称为字符类。方括号被用于指定字符集。使用字符集内的连字符来指定字符范围。方括号内的字符范围的顺序并不重要。
例如正则表达式[Tt]he
,表示: 大写T
或小写t
,后跟字母h
,再后跟字母e
。
"[Tt]he" => The car parked in the garage.
- 然而,字符集中的英文句号表示它字面的含义。正则表达式
ar[.]
,表示小写字母a
,后面跟着一个字母r
,再后面跟着一个英文句号.
字符。
"ar[.]" => A garage is a good place to park a car.
- 一般来说插入字符
^
表示一个字符串的开始,但是当它在方括号内出现时,它会取消字符集。例如正则表达式[^c]ar
,表示: 除了字母c
以外的任意字符,后面跟着字符a
,
再后面跟着一个字母r
。
"[^c]ar" => The car parked in the garage.
- 该符号
*
表示匹配上一个匹配规则的零次或多次。正则表达式a*
表示小写字母a
可以重复零次或者多次。但是它如果出现在字符集或者字符类之后,它表示整个字符集的重复。
例如正则表达式[a-z]*
,表示: 一行中可以包含任意数量的小写字母。
"[a-z]*" => The car parked in the garage #21.
- 该
*
符号可以与元符号.
用在一起,用来匹配任意字符串.*
。该*
符号可以与空格符\s
一起使用,用来匹配一串空格字符。
例如正则表达式\s*cat\s*
,表示: 零个或多个空格,后面跟小写字母c
,再后面跟小写字母a
,再再后面跟小写字母t
,后面再跟零个或多个空格。
"\s*cat\s*" => The fat cat sat on the cat.
- 该符号
+
匹配上一个字符的一次或多次。例如正则表达式c.+t
,表示: 一个小写字母c
,后跟任意数量的字符,后跟小写字母t
。
"c.+t" => The fat cat sat on the mat.
- 在正则表达式中,元字符
?
用来表示前一个字符是可选的。该符号匹配前一个字符的零次或一次。
例如正则表达式[T]?he
,表示: 可选的大写字母T
,后面跟小写字母h
,后跟小写字母e
。
"[T]he" => The car is parked in the garage. "[T]?he" => The car is parked in the garage.
- 在正则表达式中花括号(也被称为量词 ?)用于指定字符或一组字符可以重复的次数。例如正则表达式
[0-9]{2,3}
,表示: 匹配至少2位数字但不超过3位(0到9范围内的字符)。
"[0-9]{2,3}" => The number was 9.9997 but we rounded it off to 10.0.
- 我们可以省略第二个数字。例如正则表达式
[0-9]{2,}
,表示: 匹配2个或更多个数字。如果我们也删除逗号,则正则表达式[0-9]{2}
,表示: 匹配正好为2位数的数字。
"[0-9]{2,}" => The number was 9.9997 but we rounded it off to 10.0. "[0-9]{2}" => The number was 9.9997 but we rounded it off to 10.0.
- 字符组是一组写在圆括号内的子模式
(...)
。正如我们在正则表达式中讨论的那样,如果我们把一个量词放在一个字符之后,它会重复前一个字符。
但是,如果我们把量词放在一个字符组之后,它会重复整个字符组。
例如正则表达式(ab)*
表示匹配零个或多个的字符串 “ab”。我们还可以在字符组中使用元字符|
。例如正则表达式(c|g|p)ar
,表示: 小写字母c
、g
或p
后面跟字母a
,后跟字母r
。
"(c|g|p)ar" => The car is parked in the garage.
- 在正则表达式中垂直条
|
用来定义分支结构,分支结构就像多个表达式之间的条件。现在你可能认为这个字符集和分支机构的工作方式一样。
但是字符集和分支结构巨大的区别是字符集只在字符级别上有作用,然而分支结构在表达式级别上依然可以使用。
例如正则表达式(T|t)he|car
,表示: 大写字母T
或小写字母t
,后面跟小写字母h
,后跟小写字母e
或小写字母c
,后跟小写字母a
,后跟小写字母r
。
"(T|t)he|car" => The car is parked in the garage.
- 正则表达式中使用反斜杠
\
来转义下一个字符。这将允许你使用保留字符来作为匹配字符{ } [ ] / \ + * . $ ^ | ?
。在特殊字符前面加\
,就可以使用它来做匹配字符。
例如正则表达式.
是用来匹配除了换行符以外的任意字符。现在要在输入字符串中匹配.
字符,正则表达式(f|c|m)at\.?
,表示: 小写字母f
、c
或者m
后跟小写字母a
,后跟小写字母t
,后跟可选的.
字符。
"(f|c|m)at\.?" => The fat cat sat on the mat.
- 插入符号
^
符号用于检查匹配字符是否是输入字符串的第一个字符。如果我们使用正则表达式^a
(如果a是起始符号)匹配字符串abc
,它会匹配到a
, 这个需要注意的是和[^]非操作进行区分;
但是如果我们使用正则表达式^b
,它是匹配不到任何东西的,因为在字符串abc
中 “b” 不是起始字符。
让我们来看看另一个正则表达式^(T|t)he
,这表示: 大写字母T
或小写字母t
是输入字符串的起始符号,后面跟着小写字母h
,后跟小写字母e
。
"(T|t)he" => The car is parked in the garage. "^(T|t)he" => The car is parked in the garage.
- 美元
$
符号用于检查匹配字符是否是输入字符串的最后一个字符。例如正则表达式(at\.)$
,表示: 小写字母a
,后跟小写字母t
,后跟一个.
字符,且这个匹配器必须是字符串的结尾。
"(at\.)" => The fat cat. sat. on the mat. "(at\.)$" => The fat cat sat on the mat.
python中正则表达式的使用
- python中提供了一个正则表达式的模块re,同时如果使用pandas进行数据操作时, 如果clomn为string类型,则可以对其转换为string类型,然后再对其进行str.extract,str.replace等操作对其进行正则向提取,具体re模块的几个用法如下:
- re.compile: 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。当然一般情况下也可以自己去写
re.compile(r'\d+') # 用于匹配至少一个数字
- re.match: | re.search: 这两个都是用来匹配正则表达式是否存在的,re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
line = "Cats are smarter than dogs";
matchObj = re.match( r'dogs', line, re.M|re.I)
if matchObj:
print "match --> matchObj.group() : ", matchObj.group()
else:
print "No match!!"
matchObj = re.search( r'dogs', line, re.M|re.I)
if matchObj:
print "search --> searchObj.group() : ", matchObj.group()
else:
print "No match!!"
- re.sub: 这个函数用来将匹配到的项转换为其它的,具体用法如下,但是这个其实效率不怎么高,高一点效率的方法,如果数据格式是pandas的话可以使用str.replace效率会高很多.
phone = "2004-959-559 # 这是一个国外电话号码"
# 删除字符串中的 Python注释
num = re.sub(r'#.*$', "", phone)
print "电话号码是: ", num
# 删除非数字(-)的字符串
num = re.sub(r'\D', "", phone)
print "电话号码是 : ", num
电话号码是: 2004-959-559
电话号码是 : 2004959559
- re.finditer: 通过这个建立一个模板得到模板类所有的值和索引
string = "122203440781222"
pattern = re.compile(r'12+')
pattern.findall(string)
print([(m.group(), m.span()) for m in re.finditer(pattern, string)])