如何在regexp中制作自定义点?

时间:2015-05-04 03:52:00

标签: python regex

正常点匹配除换行符之外的所有字符。如果我想匹配所有字符包括换行符,我可以使用[\ s \ S](只是一个例子)来获得正确的结果。

但是有些情况如“匹配所有字符除了';' “?

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

如何使用*来定制带有我想要的点?

2 个答案:

答案 0 :(得分: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在这里非常有用。

答案 1 :(得分: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']