面向人类的python正则表达式

python-rex的Python项目详细描述


欢迎使用python rex

https://pypip.in/v/python-rex/badge.pnghttps://pypip.in/d/python-rex/badge.pnghttps://travis-ci.org/cypreess/python-rex.png?branch=masterhttps://coveralls.io/repos/cypreess/python-rex/badge.png?branch=master

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')用于启用iu标志。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

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何在IntelliJ中导入Gradle项目?   java使用dropwizard在ContainerResponseFilter上注入HttpServletRequest HttpServletRequest   基于Java的简单规则引擎的回退实现   java无法在引号“”中获取字符串值(Android)   直接从java书籍中复制的用户界面代码不希望运行   java如何检查已安装的libevent版本?   javascript如何在CryptoJS中解密文件,由JAVA使用AES加密   如何为自制软件打包Java GUI应用程序   java IntelliJ,在调试模式下运行glassfish,未部署工件   swing重新打开以前关闭的窗口Java   带参数的java测试资源   此URL不支持java HTTP Status 405 HTTP方法GET,即使没有doget()方法   java Heroku应用程序使用s3上传图像   java使两个水平文本视图在一起小于某个宽度时保持左侧,但如果它们大于宽度,则省略左侧视图?   Thymeleaf中的java绑定列表;索引超出范围   java类型JspWriter中的print(boolean)方法不适用于参数   java安卓要么没有足够的内存用于后台任务,要么GC有问题   如何使用证书过期的旧java小程序?   java如何从事件中获取数据到主函数?