我可以在Python正则表达式中混合字符类吗?

我可以在Python正则表达式中混合字符类吗?,python,regex,Python,Regex,Python正则表达式中的特殊序列(字符类)是与一组字符匹配的转义,如\w或\d 在我的例子中,我需要能够匹配除数字以外的所有字母数字字符 也就是说,\w减去\d 我需要使用特殊序列\w,因为我处理的是非ASCII字符,需要匹配像“Æ”和“Ø”这样的符号 有人会认为我可以使用这个表达式:[\w^\d],但它似乎与任何内容都不匹配,我也不知道为什么 简言之,如何在Python正则表达式中混合(加/减)特殊序列 编辑:我不小心用了[\W^\d]而不是[\W^\d]。后者确实匹配一些东西,包括括号和

Python正则表达式中的特殊序列(字符类)是与一组字符匹配的转义,如
\w
\d

在我的例子中,我需要能够匹配除数字以外的所有字母数字字符

也就是说,
\w
减去
\d

我需要使用特殊序列
\w
,因为我处理的是非ASCII字符,需要匹配像“Æ”和“Ø”这样的符号

有人会认为我可以使用这个表达式:
[\w^\d]
,但它似乎与任何内容都不匹配,我也不知道为什么

简言之,如何在Python正则表达式中混合(加/减)特殊序列



编辑:我不小心用了
[\W^\d]
而不是
[\W^\d]
。后者确实匹配一些东西,包括括号和逗号,就我而言它们不是字母数字字符。

不能减去字符类,不

最好使用新的set替换python中当前的
re
模块。它支持基于Unicode属性的字符类:

\p{IsAlphabetic}
这将匹配Unicode规范声明为字母字符的任何字符

更好的是,
regex
支持字符类减法;它将此类类视为集合,并允许您使用
--
运算符创建差异:

[\w--\d]
>>> re.search(r'((?!\d)[\w])+', '12bac15')
<_sre.SRE_Match object at 0x7f44cd2588a0>
>>> _.group(0)
'bac'

匹配
\w
中的所有内容,但也匹配
\d

的内容除外。我不认为可以在单个正则表达式中直接组合(布尔和)字符集,无论一个是否为反。否则,您可以简单地组合
[^\d]
\w

注意:
^
必须位于集合的开头,并且适用于整个集合。从文档中:“如果集合的第一个字符是“^”,则集合中不存在的所有字符都将匹配。”。 您的集合
[\w^\d]
尝试匹配字母数字字符,后跟插入符号和数字。我可以想象这和任何东西都不匹配

我将分两步进行,有效地结合正则表达式。首先按非数字匹配(内部正则表达式),然后按字母数字字符匹配:

re.search('\w+', re.search('([^\d]+)', s).group(0)).group(0)
或者这个主题的变体


请注意,需要用一个
try:except:
块来包围它,因为如果两个正则表达式中的一个失败,它将抛出一个
AttributeError:“NoneType”对象没有属性“group”
。当然,您可以将这一行拆分为几行。

您可以使用否定的先行断言排除类,例如
r'(?!\d)[\w]'
以匹配单词字符,排除数字。例如:

>>> re.search(r'(?!\d)[\w]', '12bac')
<_sre.SRE_Match object at 0xb7779218>
>>> _.group(0)
'b'

您可以使用
r“[^\W\d]”
,即反转非字母数字和数字的并集。

这仅适用于一个字母组合;你必须把它分成一个更大的小组才能工作。当然,但[…]匹配也是如此。我将更新答案以明确说明它。请注意,您需要设置
re.UNICODE
,以匹配
æ
和其他非ASCII字符。OP可能已经这样做了,但它需要说明。在这种情况下,如何向字符类添加特定字符,例如空格或逗号?@Codemonkey您可以使用非捕获组和
(?:[^\W\d]|[,])
+1 for
regex
,但实际上它支持类减法:
[\W--\d]
@thg435:酷,我也发现了。:-)你的表达式匹配字母、数字和^,我想。^对于否定类,应将其置于类定义的开头