正文
- 要匹配所有的字符,可使用类似于
[\s\S]
或[\w\W]
这样的表达式,大写和小写匹配的字符时互补的 - 比如
\S
匹配可见字符,\s
匹配不可见字符 -
>>> re.search(r'([\s\S]*)', 'aa\nbb\ncc').groups() ('aa\nbb\ncc',)
扩展(.|\n
)
- 但是故事到这里还没有结束
- 我们都知道
.
可以匹配除\n
任意字符,而文手册中有说明:要匹配包括“\n”在内的任何字符,请使用像“(.|\n)”的模式。
- 但是我们尝试这个组合的时候出了一点意外:
-
>>> re.search(r'([.|\n]*)', 'aa\nbb\ncc').groups() ('',)
- 结果什么都没有匹配到!这是为什么呢?尝试
[\n|.]
或者[.\n]
都是一样的结果,.
和\n
就好像就是有仇一样,网上搜了半天也没有见到关于这个的解释。看的所有办法都是用正文的那种方式。 - 然后尝试多次之后发现我误会
\n
了,这件事情是[]
的锅:>>> re.search(r'([.])', 'aa\nbb\ncc').groups() AttributeError: 'NoneType' object has no attribute 'groups' >>> re.findall(r'(.|\n)', 'aa\nbb\ncc') ['a', 'a', '\n', 'b', 'b', '\n', 'c', 'c'] >>> re.findall(r'[.|\n]', 'aa\nbb\ncc') ['\n', '\n'] >>> re.findall(r'[.|\n]', '...\n') ['.', '.', '.', '\n']
- 原来
.
在方括号内时只能匹配.
字符本身! - 翻阅 python 文档中正则表达式模块,其中对于
[]
集合的描述中:
特殊字符在集合中,失去它的特殊含义。比如 [(+)] 只会匹配这几个文法字符 ‘(’, ‘+’, '’, or ‘)’。
- 至此谜团解开了,
[]
内的.
不再具有特殊意义,仅代表其本身,其他由特殊意义的字符也都仅代表本身。
后续
-
作为一个强迫症患者,就是想把
.
和\n
放在一起匹配所有字符怎么办?>>> re.search(r'((?:.|\n)*)', 'aa\nbb\ncc').groups() ('aa\nbb\ncc',)
-
(?:pattern)
来解决方括号不适用的场景,正则表达式还是很强大的ヽ( ̄▽ ̄)ノ