面向人类的python正则表达式
python-rex的Python项目详细描述
欢迎使用python rex
pythonrex是人类的正则表达式。(re x也是rextend的缩写)。
rex用于re standard moduleas requests用于urllib module。
rex也是latin for “king”,正则表达式之王是perl。 因此rexapi试图至少模仿一些perl的习惯用法。
支持的python版本:2.6、2.7、3.3
安装
pip install python-rex
或
pip install -e git+https://github.com/cypreess/python-rex.git#egg=rex-dev
没有外部依赖项。
from rex import rex
快速启动
这样做:
from rex import rex print ("Your ticket number: XyZ-1047. Have fun!" == rex("/[a-z]{3}-(\d{4})/i"))[1]
而不是这样做:
import re regex = re.compile("[a-z]{3}-(\d{4})", flags=re.IGNORECASE) m = regex.search("Your ticket number: XyZ-1047. Have fun!") if m is not None: print m.group(1) else: print None # or in shorter way print m.group(1) if m else None
(两者都应该打印1047)。
文档
到目前为止,rex支持:
- 简单匹配(第一个匹配),
- 替换,
- 所有python重新标记。
匹配
最明显的用法-通过匹配字符串来测试条件:
if 'This is a dog' == rex('/dog/'): print 'Oh yeah'
或:
if 'My lucky 777 number' == rex('/[0-9]+/'): print 'Number found'
您可以使用perl符号并在搜索前添加m字符:
if 'My lucky 777 number' == rex('m/[0-9]+/'): print 'Number found'
但您也可以简单地检查匹配项:
if ('My lucky 777 number' == rex('m/[0-9]+/'))[0] == '777': print 'Number found'
甚至分组:
if ('My lucky 777 number' == rex('m/(?P<number>[0-9]+)/'))['number'] == '777': print 'Number found'
还记得Re-module不匹配时的混乱吗?雷克斯不会让你失望的, 无论您要求什么,它都将返回None:
>>> print ('My lucky 777 number' == rex('m/(?P<number>[0-9]+)/'))['no_such_group'] None >>> print ("I don't tell you my lucky number" == rex('m/(?P<number>[0-9]+)/'))['number'] None
替代
置换可以用^ {Tt4}$元(如Perl表达式中的)的前缀模式:
>>> print "This is a cat" == rex('s/CAT/dog/i') This is a dog
标志
Perl模式中的每个rex模式都允许为某些标志添加后缀,例如rex('/pattern/iu')用于启用i和u标志。rex支持所有标准的python re标志:
- d-re.debug
- i-re.ignorecase
- l-re.locale
- m-re.multiline
- s-re.dotall
- u-re.unicode
- x-re.verbose
缓存
rex缓存所有模式,因此重用模式非常快。通过调用rex_clear_cache()或 禁用特定模式的缓存rex('/pattern/', cache=False)。
东正教的雷克斯
如果您是如此正统的pythonist,以至于不能在代码基中使用重载的==运算符语法, 你可以用雷克斯的“正统模式”。只需将要匹配/替换的字符串作为第二个参数:
>>> bool(rex("/dog/", "This is a dog")) True >>> rex("s/cat/dog/", "This is a cat") 'This is a dog'
此外,rex对象是可调用的。这在需要处理许多值的情况下特别有用 针对同一正则表达式:
>>> my_re = rex("/foo/") >>> for thing in ["foobar", "bar", "barfoo"]: ... print bool(my_re(thing)) True False True