如何创建一个正则表达式类,它是两个其他正则表达式类的交集?例如,如何在不显式构造包含所有辅音的正则表达式的情况下搜索[a-z]
和[^aeiou]
的辅音:
[bcdfghjlkmnpqrstvwxyz] # explicit consonant regex class
答案 0 :(得分:5)
这个正则表达式可以解决这个问题:(?=[^aeiou])(?=[a-z])
。
第一个组(?=...)
声明模式[^aeiou]
可以匹配,然后在开始时重新开始匹配并继续到第二个模式(以相同的方式工作),它就像一个{ {3}},只有当这两个表达式都匹配时,整个正则表达式才会匹配。
答案 1 :(得分:3)
作为Python re
模块的替代方法,您可以使用regex
库显式执行此操作,该库支持字符类的集合操作:
运算符按优先级递增的顺序为:
联盟的{p>||
(“x||y”
表示“x或y”) 对称差异的交叉点的{p>
~~
(双倍波浪)(“x~~y”
表示“x或y,但不是>两者都是”)&&
(“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]]