python正则表达式处理各类异常符号总结

正则表达式的总结

@(作者:朝天椒)[WeChat:skyloving123||公众号:财天椒]

正则表达式介绍

  • 正则表达式是从左到右来匹配一个字符串的。“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)])
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

算法驯化师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值