有没有一种简单的方法来匹配一个类中的所有字符,除了一组字符?例如,如果在我可以使用 \w 匹配所有 unicode 单词字符集的语言中,有没有办法从匹配中排除下划线“_”之类的字符?
想到的唯一想法是在每个字符周围使用负前瞻/后视,但是当我实际上只想将一个字符与正匹配和负匹配进行匹配时,这似乎比必要的复杂。例如,如果 & 是 AND 运算符,我可以这样做......
^(\w&[^_])+$
有没有一种简单的方法来匹配一个类中的所有字符,除了一组字符?例如,如果在我可以使用 \w 匹配所有 unicode 单词字符集的语言中,有没有办法从匹配中排除下划线“_”之类的字符?
想到的唯一想法是在每个字符周围使用负前瞻/后视,但是当我实际上只想将一个字符与正匹配和负匹配进行匹配时,这似乎比必要的复杂。例如,如果 & 是 AND 运算符,我可以这样做......
^(\w&[^_])+$
这真的取决于你的正则表达式风格。
...仅提供一种简单的字符类集操作:减法。这对于您的示例来说已经足够了,因此您可以简单地使用
[\w-[_]]
如果 a-
后跟一个嵌套字符类,则将其减去。就那么简单...
... 提供更丰富的字符类集操作集。特别是,您可以获得两组的交集,例如[[abc]&&[cde]]
(c
在这种情况下会给出)。交集和否定一起给你减法:
[\w&&[^_]]
... 支持对扩展字符类的设置操作作为实验性功能(自 Perl 5.18 起可用)。特别是,您可以直接减去任意字符类:
(?[ \w - [_] ])
...(支持前瞻)允许您通过使用负前瞻来模拟减法:
(?!_)\w
这首先检查下一个字符是否不是 a_
然后匹配任何字符\w
(这不可能是_
由于负前瞻)。
请注意,这些方法中的每一种都是完全通用的,因为您可以减去两个任意复杂的字符类。
您可以使用对\w
类 (--> \W
) 的否定并将其排除:
^([^\W_]+)$
就我理解您的问题而言,消极的前瞻是正确的方法:
^((?!_)\w)+$
这可以使用regex 模块在python中完成。就像是:
import regex as re
pattern = re.compile(r'[\W_--[ ]]+')
cleanString = pattern.sub('', rawString)
您通常会使用pip安装 regex 模块:
pip install regex
编辑:
正则表达式模块有两种行为,版本 0 和版本 1。设置减法(如上)是版本 1 的行为。pypi 文档声称版本 1 是默认行为,但您可能会发现情况并非如此。你可以检查
import regex
if regex.DEFAULT_VERSION == regex.VERSION1:
print("version 1")
要将其设置为版本 1:
regex.DEFAULT_VERSION = regex.VERSION1
或在单个表达式中使用版本一:
pattern = re.compile(r'(?V1)[\W_--[ ]]+')
尝试使用减法:
[\w&&[^_]]+
注意:这适用于 Java,但可能不适用于其他 Regex 引擎。