前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Pregex:在Python中编写可读的正则表达式

Pregex:在Python中编写可读的正则表达式

作者头像
deephub
发布2022-11-11 17:50:07
4750
发布2022-11-11 17:50:07
举报
文章被收录于专栏:DeepHub IMBA

正则表达式很好用,但是却很难阅读和创建。有没有办法可以轻松地编写更可读的正则呢?Python的包Pregex就解决了这个问题。

Pregex是一个Python软件包,可让以更友好的方式构建正则表达式。

要安装Pregex,请输入:

代码语言:javascript
复制
pip install pregex

那么它有什么功能呢,我们用几个例子来解释:

首先将尝试使用Pregex在文本中获取URL。

代码语言:javascript
复制
from pregex.classes import AnyButWhitespace
from pregex.quantifiers import AtLeastOnce
from pregex.operators import Either

text = "You can find me through GitHub https://www.overfit.cn"

pre = (
    "https://"
    + AtLeastOnce(AnyButWhitespace())
    + Either(".com", ".cn")
    + AtLeastOnce(AnyButWhitespace())
)

输出

代码语言:javascript
复制
['https://www.overfit.cn']

在上面的代码中,我们使用:

  • AnyButWhitespace() 匹配除空格字符以外的任何字符
  • AtLeastOnce()将提供的模式匹配一次或多次。
  • Either匹配列表中的任意一个

具体来说,

Atleastonce(AnyButWhitespace())匹配一个或多个不是白空间字符的字符。Either(“.com”,“ .cn“ )匹配“.com”,“ .cn“ 中的一个。

如果需要增加https和http的判断则需要改成如下形式:

代码语言:javascript
复制
from pregex.quantifiers import Optional
pre = (
    "http"
    + Optional("s")
    + "://"
    + AtLeastOnce(AnyButWhitespace())
    + Either(".com", ".cn")
    + AtLeastOnce(AnyButWhitespace())
)
pre.get_matches(text)

通过使用Optional()使字符串s变为可选项

也可以使用pre.get_pattern() 方法获取输出的正则表达式

如果需要获取时间,可以使用AnyDigit()匹配任何数字字符。让可以用它来匹配文本中的时间。

代码语言:javascript
复制
from pregex.classes import AnyDigit

text = "It is 6:00 pm now"
pre = AnyDigit() + ":" + AnyDigit()
pre.get_matches(text)

结果如下:

代码语言:javascript
复制
['6:0']

现在通过将Addleastonce()和AnyDigit()一起使用:

代码语言:javascript
复制
pre = AtLeastOnce(AnyDigit()) + : + AtLeastOnce(AnyDigit())
pre.get_matches(text)

结果如下:

代码语言:javascript
复制
['6:00']

获取电话号码也是一样的,电话号码的通用格式:

代码语言:javascript
复制
##########
###-###-####
### ### ####
###.###.####

可以使用AnyFrom("-", " ", ".")匹配两者 - 。,或空。然后使用Optional()。

代码语言:javascript
复制
text = "My phone number is 3452352312 or 345-235-2312 or 345 235 2312 or 345.235.2312"

punctuation = AnyFrom("-", " ", ".")
optional_punctuation = Optional(punctuation)
at_least_one_digit = AtLeastOnce(AnyDigit())

pre = (
    at_least_one_digit
    + optional_punctuation
    + at_least_one_digit
    + optional_punctuation
    + at_least_one_digit
)
pre.get_matches(text)
['3452352312', '345-235-2312', '345 235 2312', '345.235.2312']

这里有点复杂,用图表看下:

获取邮件地址:

代码语言:javascript
复制
pre = (
    AtLeastOnce(AnyButWhitespace())
    + "@"
    + AtLeastOnce(AnyButWhitespace())
    + Either(".com", ".org", ".io", ".net")
)

这样通过代码就可以简单的生成正则表达式,非常方便

如果你对pregex感兴趣 官网的地址如下:

https://pregex.readthedocs.io/en/latest/docstring/pregex.html#

喜欢就关注一下吧:

点个在看你最好看

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-07-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DeepHub IMBA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档