正则表达式很好用,但是却很难阅读和创建。有没有办法可以轻松地编写更可读的正则呢?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#
喜欢就关注一下吧:
点个在看你最好看