python 正则表达式点号与'\n'符号的问题

遇到了一个小虫,特记录之。

1.正则表达式及英文的处理如下:

>>> import re
>>> b='adfasdfasf<1safadsaf>23wfsa<13131>'
>>> pat = re.compile('<.*?>')
>>> pat.findall(b)
['<1safadsaf>', '<13131>']

 

2. 换成中文貌似就没反应了

>>> msg="<Fault warning -- \xb4\xed\xce\xf3!\n\n\xb2\xfa\xc6\xb7\xb1\xe0\xba\xc5\xb1\xd8\xd0\xe8\xce\xa8\xd2\xbb,\xd0\xc2\xb1\xe0\xba\xc53123\xb6\xd4\xd3\xa6\xb5\xc4\xb2\xfa\xc6\xb7\xd2\xd1\xbe\xad\xb4\xe6\xd4\xda!\n\xc8\xe7\xb9\xfb\xc4\xfa\xca\xd4\xcd\xbc\xcd\xa8\xb9\xfd\xb8\xb4\xd6\xc6\xc0\xb4\xc9\xfd\xbc\xb6\xb2\xfa\xc6\xb7\xd4\xf2\xcb\xb5\xc3\xf7\xb4\xcb\xb2\xfa\xc6\xb7\xd2\xd1\xbe\xad\xb4\xe6\xd4\xda\xc9\xfd\xbc\xb6\xb0\xe6\xa3\xac\xc7\xeb\xc1\xf4\xd2\xe2\xa1\xa3: ''>"
>>> pat.findall(msg)
[]

仔细分析了下貌似因为其中的\n字符!

甚为不解,又try了一把:

>>> msg ='<\r>asdasf<asdfaf>'
>>> pat.findall(msg)
['<\r>', '<asdfaf>']
>>> msg='<\n>adf<afd>'
>>> pat.findall(msg)
['<afd>']
>>> msg='<\s>adaf<asdfa>'
>>> pat.findall(msg)
['<\\s>', '<asdfa>']
>>> msg='<\n>asdfasf<asfa>'
>>> pat.findall(msg)
['<asfa>']

确实点号无法匹配特殊字符'\n'!

这里找到了说明。

 

.匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。

 

 

 

3.[.\n]的尴尬情况

>>> pat= re.compile('<[.\n]*?>')
>>> pat.findall(msg)
['<\n>']
>>> msg
'<\n>asdfasf<asfa>'
>>> msg='<\nasdfs>adaf<adaf>'
>>> pat.findall(msg)
[]

 

谷歌了一番,找到了答案,在这里。即加入DOTALL选项。如下:

>>> pat = re.compile('<.*?>',re.DOTALL)
>>> pat.findall(msg)
['<\nasdfs>', '<adaf>']

  

 

转载于:https://www.cnblogs.com/Tommy-Yu/p/4194991.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
正则表达式是一种用于匹配文本字符串的模式,它可以用来检查一个字符串是否符合某种模式,或者从一段字符串中提取出符合规则的文本。在 Python 中,我们可以使用 `re` 模块来操作正则表达式。 下面是一些常用的正则表达式语法: - `.`:匹配任意字符,除了换行符。 - `*`:匹配前面的字符零次或多次。 - `+`:匹配前面的字符一次或多次。 - `?`:匹配前面的字符零次或一次。 - `^`:匹配字符串开头。 - `$`:匹配字符串结尾。 - `[]`:匹配括中的任意一个字符。 - `|`:匹配左右两边任意一个表达式。 - `\`:转义字符,用于匹配特殊字符。 下面是一个简单的例子,用正则表达式匹配邮箱地址: ```python import re email = 'abc123@qq.com' pattern = r'^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$' if re.match(pattern, email): print('Valid email address') else: print('Invalid email address') ``` 输出结果为 `Valid email address`,说明该邮箱地址符合规则。 其中,`pattern` 变量存储了正则表达式的模式,`re.match()` 函数用于判断字符串是否匹配该模式。在这个例子中,`^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$` 是一个匹配邮箱地址的正则表达式,具体解释如下: - `^`:匹配字符串开头。 - `\w+`:匹配一个或多个字母、数字或下划线。 - `@`:匹配 `@` 符号。 - `[a-zA-Z_]+?`:匹配一个或多个字母或下划线,非贪婪模式。 - `\.`:匹配一个。 - `[a-zA-Z]{2,3}`:匹配两个或三个字母。 - `$`:匹配字符串结尾。 以上是一个简单的正则表达式示例,实际上正则表达式非常强大,可以用于复杂的文本处理任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值