是否有一种简单的方式可以匹配一个字符类中除了特定一组字符以外的所有字符?例如,如果在一种语言中我可以使用\w来匹配所有Unicode单词字符的集合,那么有没有一种方法可以从该匹配中排除下划线“_”这个字符?
我能想到的唯一主意是在每个字符周围使用负向前/后查看,但当我实际上只想将一个字符与正匹配和负匹配相匹配时,这似乎比必要更复杂。例如,如果&是AND运算符,我可以这样做......
^(\w&[^_])+$
是否有一种简单的方式可以匹配一个字符类中除了特定一组字符以外的所有字符?例如,如果在一种语言中我可以使用\w来匹配所有Unicode单词字符的集合,那么有没有一种方法可以从该匹配中排除下划线“_”这个字符?
我能想到的唯一主意是在每个字符周围使用负向前/后查看,但当我实际上只想将一个字符与正匹配和负匹配相匹配时,这似乎比必要更复杂。例如,如果&是AND运算符,我可以这样做......
^(\w&[^_])+$
这实际上取决于您使用的正则表达式工具。
...仅提供一种简单的字符类集运算:减法操作。这对于您的示例已经足够了,所以您可以简单地使用
[\w-[_]]
如果一个 -
后面跟着一个嵌套的字符集,就会发生减法操作。就是这么简单...
...提供了一组更丰富的字符类集合操作。特别是您可以像 [[abc]&&[cde]]
这样获取两个集合的交集(在这种情况下将给出 c
)。交集和取反结合在一起就能实现减法操作:
[\w&&[^_]]
……作为一项实验性功能(自 Perl 5.18 起可用),支持在扩展字符类上进行集合操作。特别地,您可以直接从任意字符类中减去:
(?[ \w - [_] ])
...(支持前瞻的)都允许您通过使用负向前瞻来模拟减法:
(?!_)\w
首先检查下一个字符不是 _
,然后匹配任何一个 \w
(由于负向先行断言,它不能是 _
)。
请注意,这些方法都是完全通用的,因为您可以从两个任意复杂的字符类中减去。
\w
类(--> \W
) 的方法:^([^\W_]+)$
[[:alnum:]\pP]
或[\p{Xan}\pP]
。换句话说,你必须找到每种情况的最佳解决方案,并使用预定义的类。 - Casimir et Hippolyte就我理解你的问题,负向先行断言是正确的方法:
^((?!_)\w)+$
import regex as re
pattern = re.compile(r'[\W_--[ ]]+')
cleanString = pattern.sub('', rawString)
一般情况下,您可以使用pip安装正则表达式模块:
pip install regex
编辑:
正则表达式模块有两种行为,版本0和版本1。设置子字符串(如上所述)是版本1的行为。 pypi文档声称版本1是默认行为,但您可能会发现情况并非如此。您可以使用以下命令进行检查:
import regex
if regex.DEFAULT_VERSION == regex.VERSION1:
print("version 1")
regex.DEFAULT_VERSION = regex.VERSION1
或者在单个表达式中使用第一版本:
pattern = re.compile(r'(?V1)[\W_--[ ]]+')
尝试使用减法:
[\w&&[^_]]+
[\w-[_]]
来排除下划线。 - HamZa\w
只识别ASCII单词字符([A-Za-z0-9_]
),而不是完整的Unicode集。Python内置的re
也是同样的情况。 - Alan Moore