读了《用 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
网友评论