正常点匹配除换行符之外的所有字符。如果我想匹配所有字符包括换行符,我可以使用[\ s \ S](只是一个例子)来获得正确的结果。
但是有些情况如“匹配所有字符除了';' “?
或“匹配除'A'和'b'和'c'之外的所有字符”?
如何使用*来定制带有我想要的点?
答案 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']