是否有一种简单的方法可以匹配某个类中的所有字符,除了它们中的某一组?例如,如果在我可以使用\ w来匹配所有unicode单词字符集的语言中,有没有办法从该匹配中排除像下划线“_”这样的字符?
只有想到的想法是在每个角色周围使用负向前瞻/后面但是当我有效地想要将角色与正匹配和负匹配匹配时,这似乎比必要更复杂。例如,如果&是一个AND运算符,我可以这样做......
^(\w&[^_])+$
答案 0 :(得分:17)
这实际上取决于你的正则表达方式。
...只提供一个简单的字符类集操作:subtraction。这足以满足您的示例,因此您只需使用
即可[\w-[_]]
如果-
之后是嵌套的字符类,则将其减去。很简单...
...提供了更丰富的character class set operations。特别是你可以获得两个集合的交集,例如[[abc]&&[cde]]
(在这种情况下会给出c
)。交叉和否定一起给你减法:
[\w&&[^_]]
...支持extended character classes上的设置操作作为实验性功能(自Perl 5.18起可用)。特别是,您可以直接减去任意字符类:
(?[ \w - [_] ])
...(支持前瞻)允许您使用否定前瞻模仿减法:
(?!_)\w
首先检查下一个字符是否不是_
,然后匹配任何\w
(由于否定前瞻而不能_
。)
请注意,这些方法中的每一种都是完全一般的,因为您可以减去两个任意复杂的字符类。
答案 1 :(得分:8)
您可以使用\w
类的否定( - > \W
)并排除它:
^([^\W_]+)$
答案 2 :(得分:6)
在我理解你的问题的情况下,一个消极的先行是正确的方式:
^((?!_)\w)+$
答案 3 :(得分:5)
尝试使用减法:
[\w&&[^_]]+
注意:这可以在Java中使用,但在其他一些Regex引擎中可能不行。
答案 4 :(得分:4)
这可以使用regex module在 python 中完成。类似的东西:
import regex as re
pattern = re.compile(r'[\W_--[ ]]+')
cleanString = pattern.sub('', rawString)
您通常使用pip安装正则表达式模块:
pip install regex
修改强>:
正则表达式模块有两个行为,版本0和版本1.设置减法(如上所述)是版本1行为。 pypi docs声明版本1是默认行为,但您可能会发现情况并非如此。您可以查看
import regex
if regex.DEFAULT_VERSION == regex.VERSION1:
print("version 1")
将其设置为版本1:
regex.DEFAULT_VERSION = regex.VERSION1
或在单个表达式中使用第一版:
pattern = re.compile(r'(?V1)[\W_--[ ]]+')