正则表达式简介

    Title: 正则表达式简介
   Author: "Peng Li"<aqnote@aqnote.com>
    CDate: 20190614
    MDate:
 Keywords: RE, 正则, 简介
Copyright: aqnote.com

概述

正则表达式两大流派:PCRE与POSIX规范。

0x01 PCRE

正则表达式记法,如\d、\s、\w之类的字符组简记法就是PCRE规范的正则表达式的特征。

0x02 POSIX

POSIX的全称是Portable Operating System Interface for unix,它由一系列的规范构成,定义了UNIX操作系统应当支持的功能,
因此POSIX规范的正则表达式其实就是正则表达式的POSIX规范,它分为BRE(基本型正则表达式)和ERE(扩展型正则表达式)两大流派。

0x02.01 BRE流派

Linux下的vi、grep、sed工具属于BRE这一派,BRE中元字符(、)、{、}必须转义之后才具有特殊意义,比如a{1,2}才能匹配字符串a或aa。

BRE不支持+、?量词,多选结构和反向引用\1、\2。

GNU对BRE做了扩展,使之支持+、?、|,但使用时需转义。也支持\1、\2之类的反向引用。

0x02.02 ERE流派

Linux下的egrep、awk属于ERE流派。这一流派中使用元字符时不用转义,支持量词等。

现在的BRE和ERE的主要差异是元字符是否需转义。

0x03 PCRE 字符组

. Any character
^ Start of subject (or line in multiline mode)
$ End of subject (or line in multiline mode)
[ Start character class definition
] End character class definition
| Alternates (OR)
( Start subpattern
) End subpattern
\ Escape character
\n Newline (hex 0A)
\r Carriage return (hex 0D)
\t Tab (hex 09)
\d Decimal digit
\D Charchater that is not a decimal digit
\h Horizontal whitespace character
\H Character that is not a horizontal whitespace character
\s Whitespace character
\S Character that is not a whitespace character
\v Vertical whitespace character
\V Character that is not a vertical whitespace character
\w "Word" character
\W "Non-word" character
\b Word boundary
\B Not a word boundary
\A Start of subject (independent of multiline mode)
\Z End of subject or newline at end (independent of multiline mode)
\z End of subject (independent of multiline mode)
\G First matching position in subject
n* Zero or more of n
n+ One or more of n
n? Zero or one occurrences of n
{n} n occurrences
{n,} At least n occurrences
{,m} At the most m occurrences
{n,m} Between n and m occurrences

0x04 POSIX字符组

PCRE流派中把[…]称为“字符组”;在POSIX中,它们叫做"方括号表达式",其作用与规则与常说的"字符组"完全一样。但是POSIX中的"方括号表达式"不支持使用\uxxxx的形式表示Unicode字符。即遵循POSIX规范的正则表达式无法用[\u4e00-\u9fff]来匹配"任意一个中文字符"。

POSIX自己也定义了字符组,称为"POSIX字符组",是一些事先定义好的组合,比如[:digit:]就是一个POSIX字符组,它等价于[0-9],[:alpha:]等价于[a-zA-Z]。此外PCRE中常见的\d、\w、\s在POSIX中没有定义。

POSIX字符组不能直接使用,只能用于方括号表达式内部,如[[:digit:]]、[[:alpha:]];POSIX字符组也可以与其他方括号表达式合用,如[a-zA-Z[:digit:]]、[1]。

0x05 正在表达式常用例子

0x05.01 匹配正整数

import re

pattern = re.compile(r'^[0-9]+$')

inputs = [
    "12",
    "1234a",
    "a",
    "111 "
]

for input in inputs:
    match = pattern.match(input)
    if match:
        print(match.group())
    else:
        print("No Match")

  1. :alpha: ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值