7

Python RegEx 中的特殊序列(字符类)是类似于\w\d匹配一组字符的转义。

就我而言,我需要能够匹配除数字之外的所有字母数字字符。

也就是说,\w减号\d

我需要使用特殊序列\w,因为我正在处理非 ASCII字符并且需要匹配“Æ”和“Ø”等符号。

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

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


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

4

4 回答 4

14

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

于 2012-09-10T10:11:45.030 回答
6

你不能减去字符类,不。

您最好的选择是使用新regex模块,设置为替换 python 中的当前re模块。它支持基于 Unicode 属性的字符类:

\p{IsAlphabetic}

这将匹配 Unicode 规范声明为字母字符的任何字符。

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

[\w--\d]

匹配中的所有内容,\w除了也匹配的任何内容\d

于 2012-09-10T09:48:43.467 回答
2

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

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

要排除多个组,您可以[...]在前瞻断言中使用常用语法,例如r'(?![0-5])[\w]'匹配除数字 0-5 之外的任何字母数字字符。

与 一样[...],上述构造匹配单个字符。要匹配多个字符,请添加重复运算符:

>>> re.search(r'((?!\d)[\w])+', '12bac15')
<_sre.SRE_Match object at 0x7f44cd2588a0>
>>> _.group(0)
'bac'
于 2012-09-10T10:08:28.070 回答
1

我不认为你可以在一个正则表达式中直接组合(布尔和)字符集,无论一个是否被否定。否则,您可以简单地将 and 结合[^\d]起来\w

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

我会分两步完成,有效地结合正则表达式。首先通过非数字匹配(内部正则表达式),然后通过字母数字字符匹配:

re.search('\w+', re.search('([^\d]+)', s).group(0)).group(0)

或此主题的变体。

请注意,这需要用一个try: except:块包围它,因为如果两个正则表达式之一失败,它会抛出一个AttributeError: 'NoneType' object has no attribute 'group'。但是,您当然可以将这条单行拆分为几行。

于 2012-09-10T10:06:01.100 回答