如何创建一个正则表达式类,该类是另外两个正则表达式类的交集?例如,如何使用 [a-z]
和 [^aeiou]
搜索辅音字母,而不必显式构造包含所有辅音字母的正则表达式类,就像这样:
[bcdfghjlkmnpqrstvwxyz] # explicit consonant regex class
(?=[^aeiou])(?=[a-z])
。(?=...)
断言模式[^aeiou]
可以匹配,然后重新开始匹配并移动到第二个模式(这个也是同样的方式),这就像一个逻辑 AND
,整个正则表达式只有当这两个表达式都匹配时才匹配。re
模块的替代方案,您可以使用 regex
库来明确地支持字符类的集合操作:
因此,要仅匹配辅音字母,您的正则表达式可以是:按递增优先顺序排列的运算符如下:
||
表示并集(“x||y”
表示 “x 或 y”)
~~
(双波浪线)表示对称差(“x~~y”
表示 “x 或 y,但不包括两者都有的部分”)
&&
表示交集(“x&&y”
表示 “x 和 y”)
--
(双破折号)表示差集(“x––y”
表示 “x 但不包括 y”)
>>> regex.findall('[[a-z]&&[^aeiou]]+', 'abcde', regex.VERSION1)
['bcd']
或者等价地使用集合差:
>>> regex.findall('[[a-z]--[aeiou]]+', 'abcde', regex.VERSION1)
['bcd']
在re模块中,字符类的差异或交集是不可用的,那么你该怎么办呢?
使用范围:
[bcdfghj-np-tv-z]
使用\w
字符类:
[^\W0-9_aeiouAEIOU]
(?:(?![eiou])[b-z])
[[b-z]--[eiou]]