正则匹配所有字符(包括换行)

正文

  • 要匹配所有的字符,可使用类似于 [\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) 来解决方括号不适用的场景,正则表达式还是很强大的ヽ( ̄▽ ̄)ノ

  • 13
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值