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")
:alpha: ↩︎