使用Python魔术方法实现正则表达式的新语法

96
远飞的大雁2010
2016.10.08 11:39* 字数 407

读了《用 Python 的魔术方法做出更好的正则表达式 API》 后深受启发。一直觉得Python的re模块用起来不舒服,决定按照该文的方法自已来实现一套正则表达式的语法。

re模块中的主要功能有match、search、fullmatch、finditer、findall、split、sub等方法,其中常用的也就那么几种。

重构后的新语法

判断是否匹配

if R/"\d+" == '12345':
    print("完全匹配")

if R/"\d+"/"1234adfc":
    print("存在匹配的记录")

第一个语法要求完整匹配,第二个只判断是否存在匹配的记录,如果需要从头匹配,可以在pattern的前面加“^”。

查找所有匹配的记录

for m in R/'\d+'//'123,456,789':
    print(m.group())

返回的结果为Match对象,可以通过groups、group、groupdict等方法获取匹配的内容。

搜索匹配内容

m=R/'\d+'%'abc856fds5868'
print(m.group())

从指定的字符串中搜索第一个匹配的记录。

查找所有匹配的内容

for s in R/'\d+'/'123,456,679':
    print(s)

返回的结果为匹配的字符串。

拆分字符串

for s in R/'[, |]'|'abc,def fang|jun':
    print(s)

返回的结果为拆分的字符串。

替换字符串

s=R/'hunter'/'hunter is a good person'%'lisi'

直接返回替换完成的结果。如果需要替换的次数,可以按如下的语法指定:

s=R/'good'/'a good student is a good student'%('good',1)

上面的代码只替换第一个good。

特别提示

针对上面所有的语法,除了指定正则表达式的模板外,还可以指定相应的flag。示例如下:

if R/('abc','i')=='ABC':
    print('不区分大小写匹配')

其中标签可以为字符串(不区分大小写),也可以为整数的标签。

安装方法

pip install orange-kit

使用方法

from orange import R

if R/'test'=="test":
    print('完全匹配')

# 以下为传统用法
PATTERN=R/'1[3-8]\d{9}'  # 手机号的正则表达式
s='张三 13300000001  李四 13400000005'

# 查找并打印所有的手机号
for k in PATTERN.findall(s):
    print(k)

下载源代码

git clone git@github.com:huangtao-sh/orange.git
Python
Web note ad 1