两个正则表达式类的交集

时间:2015-02-28 15:06:51

标签: python regex

如何创建一个正则表达式类,它是两个其他正则表达式类的交集?例如,如何在不显式构造包含所有辅音的正则表达式的情况下搜索[a-z][^aeiou]的辅音:

[bcdfghjlkmnpqrstvwxyz] # explicit consonant regex class

3 个答案:

答案 0 :(得分:5)

这个正则表达式可以解决这个问题:(?=[^aeiou])(?=[a-z])

第一个组(?=...)声明模式[^aeiou]可以匹配,然后在开始时重新开始匹配并继续到第二个模式(以相同的方式工作),它就像一个{ {3}},只有当这两个表达式都匹配时,整个正则表达式才会匹配。

答案 1 :(得分:3)

作为Python re模块的替代方法,您可以使用regex库显式执行此操作,该库支持字符类的集合操作:

  

运算符按优先级递增的顺序为:

     联盟的{p> ||“x||y”表示“x或y”)

     对称差异的

~~(双倍波浪)(“x~~y”表示“x或y,但不是>两者都是”)

     交叉点的{p> &&“x&&y”表示“x和y”)

     差异的{p> --(双破折号)(“x–y”表示“x但不是y”)

所以为了只匹配辅音,你的正则表达式可能是:

>>> regex.findall('[[a-z]&&[^aeiou]]+', 'abcde', regex.VERSION1)
['bcd']

或等效使用设定差异:

>>> regex.findall('[[a-z]--[aeiou]]+', 'abcde', regex.VERSION1)
['bcd']

答案 2 :(得分:0)

re模块中没有字符类差异或交集,那么您可以做什么?

使用范围:

[bcdfghj-np-tv-z]

使用\w字符类:

[^\W0-9_aeiouAEIOU]

前瞻(由于你需要对每个角色进行测试,效率不高)

(?:(?![eiou])[b-z])

使用具有差异功能的新正则表达式模块:

[[b-z]--[eiou]]