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

2022-11-11 17:50:07 浏览数 (1)

正则表达式很好用,但是却很难阅读和创建。有没有办法可以轻松地编写更可读的正则呢?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#

喜欢就关注一下吧:

点个在看你最好看

0 人点赞