2015-05-04 60 views
-1

正常点匹配除换行符外的所有字符。如果我想匹配所有包含换行符的字符,我可以使用[\ s \ S](只是一个例子)来获得正确的结果。如何在正则表达式中创建自定义点?

但是如何像“匹配所有的字符除外';' “?

或“匹配除”A“和”b“以及”c“之外的所有字符?

我该如何定制一个点与*来匹配我想要的?

+0

正则表达式的味道相差很大。一些(.NET,Python的正则表达式)支持集。哪个正则表达式? Awk,老Python,sed,Javascript甚至没有能够做到这一点... – dawg

+0

@dawg:他标记了这个Python,所以他大概不关心POSIX正则表达式,JavaScript等等。另外,哪个老的Python didn不支持字符集作为角色类?我很确定Python的正则表达式引擎从一开始就借用了Perl的语法。就像JavaScript一样。更不用说,即使POSIX基本正则表达式也支持它。我想不出任何味道。 – abarnert

+0

@abarnert:我的意思是'/ [[a-z] - [aeiou]] /'的形式,作为POSIX,sed,Python的一个例子,绝对不支持作为所有非元音字母的简写。 – dawg

回答

1

要让点匹配换行符,请使用re.DOTALL作为选项。例如:

In [4]: print re.match("A.+B","A\n\nB") 
None 

In [5]: print re.match("A.+B","A\n\nB",re.DOTALL) 
<_sre.SRE_Match object at 0x10c5d17e8> 

这改变在表达式中的所有点,虽然。另外,您也可以使用(|),只在某些情况下匹配“\ n”:

In [6]: print re.match("A(?:\n|.)+B","A\n\nB") 
<_sre.SRE_Match object at 0x10ca5feb8> 

这里我们使用:为了从制作组保持?每个(?:\n|.)将匹配一个换行换行符。

对于其他事情,您通常使用“[]”或“[^]”仅匹配一组事物,或仅匹配一组事物。除了';'之外,对于除了A,b和c之外的所有字符,使用“[^ Abc]”,而对于只有匹配那三个,使用“[Abc] ”。还有各种简写的东西,例如\ s表示空格,\ S表示非空格。通过the re documentation看这里真的很有帮助。

0

Python regex模块和一些其他正则表达式风格支持设置字符类中的操作超出简单的否定。

例如,在Python正则表达式(但不是在标准库重):

>>> import regex 
>>> s='abcdefghijklmnopqrstuvwxyz' 
>>> regex.findall(r'(?V1)[[a-z]--[c-o]]', s) 
['a', 'b', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] 

的字符类[a-z]通常会发现所有的ASCII小写字母。在这种情况下,不包括[c-o]之间的任何因素,因为它们被扣除。

的是,某种意义上可以否定,以及:

>>> regex.findall(r'(?V1)[^[a-z]--[c-o]]', s) 
['c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o'] 

或者没有元音:

>>> regex.findall(r'(?V1)[[a-zA-Z]--[aAeEiIoOuU]]', s) 
['b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'q', 'r', 's', 't', 'v', 'w', 'x', 'y', 'z'] 
+1

标准库中的're'模块_also_支持集合。它不支持像差异这样的设置操作,但是他不需要为他要求的任何示例执行这样的操作。 – abarnert