正则表达式的总结


@(作者:朝天椒)

文章目录

  • 正则表达式的总结
  • 正则表达式介绍
  • 正则表达式的基本语法
  • 常用正则表达式骚操作总结
  • 相关例子
  • python中正则表达式的使用


正则表达式介绍

  • 正则表达式是从左到右来匹配一个字符串的。“Regular Expression” 这个词太长了,我们通常使用它的缩写 “regex” 或者 “regexp”。
    正则表达式可以被用来替换字符串中的文本、验证表单、基于模式匹配从一个字符串中提取字符串等等。

正则表达式的基本语法

  • 元字符是正则表达式的基本组成元素。元字符在这里跟它通常表达的意思不一样,而是以某种特殊的含义去解释。有些元字符写在方括号内的时候有特殊含义。
    元字符如下:

元字符

描述

^

匹配行的开始

$

匹配行的结束

.

匹配除换行符以外的任意字符。

[ ]

字符类,匹配方括号中包含的任意字符,[amk] 匹配 ‘a’,‘m’或’k’

[^ ]

不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。

*

匹配前面的子表达式零次或多次

+

匹配前面的子表达式一次或多次

?

匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。

{n,m}

花括号,匹配前面字符至少 n 次,但是不超过 m 次。

(xyz)

字符组,按照确切的顺序匹配字符xyz。

|

分支结构,a|b匹配a或b

\

转义符,它可以还原元字符原来的含义,允许你匹配保留字符 [ ] ( ) { } . * + ? ^ $ \ |

\w

匹配所有字母和数字的字符: [a-zA-Z0-9_]

\W

匹配非字母和数字的字符: [^\w]

\d

匹配数字: [0-9]

\D

匹配非数字: [^\d]

\s

匹配空格符: [\t\n\f\r\p{Z}]

\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,表示: 小写字母 cgp 后面跟字母 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\.?,表示: 小写字母 fc 或者 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)])