两个正则表达式类的交集

9

如何创建一个正则表达式类,该类是另外两个正则表达式类的交集?例如,如何使用 [a-z][^aeiou] 搜索辅音字母,而不必显式构造包含所有辅音字母的正则表达式类,就像这样:

[bcdfghjlkmnpqrstvwxyz] # explicit consonant regex class

请查看此链接:https://dev59.com/9nRB5IYBdhLWcg3w6bUE - Nick Bailey
3个回答

9
这个正则表达式可以解决问题:(?=[^aeiou])(?=[a-z])
第一组(?=...)断言模式[^aeiou]可以匹配,然后重新开始匹配并移动到第二个模式(这个也是同样的方式),这就像一个逻辑 AND,整个正则表达式只有当这两个表达式都匹配时才匹配。

4
你可以将其更改为 (?=[^aeiou])[a-z],以便同时捕获匹配。 - davidrac
Davidrac,请发布一个答案,这样我就可以奖励你了。 - Malik Brahimi

7
作为 Python 的 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']

0

在re模块中,字符类的差异或交集是不可用的,那么你该怎么办呢?

使用范围:

[bcdfghj-np-tv-z]

使用\w字符类:

[^\W0-9_aeiouAEIOU]

一个前瞻(不太高效,因为您需要对每个字符进行测试):
(?:(?![eiou])[b-z])

使用具有差异特性的新正则表达式模块:
[[b-z]--[eiou]]

正则表达式模块是什么?它是Python 3标准库中的模块还是外部包? - Malik Brahimi
@MalikBrahimi:不,你需要手动添加它:https://pypi.python.org/pypi/regex - Casimir et Hippolyte
它最终会成为标准库的一部分吗? - Malik Brahimi
@MalikBrahimi:可能 - Casimir et Hippolyte

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接