正则re.sub替换指定内容(被坑4个小时)。

正则用的机会不多,就爬虫的时候,我会用一下,这次需要替换一个url内部的数字。

一般以前我用的比较多的都是查找。这次需要用到替换指定的内容,哭瞎了我!

参考连接:

https://docs.python.org/zh-cn/3/library/re.html

https://stackoverflow.com/questions/5984633/python-re-sub-group-number-after-number

https://blog.csdn.net/blmoistawinde/article/details/81839647?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control

re.sub(pattern, repl, string, count=0, flags=0)

pattern在没有进行任何设置的情况下会被后面repl全部替换。

所以,你可以在pattern通过()进行分组,然后通过\number的方式,选择需要保留的组.

api_url = re.sub(template, r'\g<1>{}\g<3>'.format(self.twitter_user_id), api_url)

  这是是我本来需要替换的组,如果直接用\1的话,后面明显跟的是数字,那这个\xxxxx的组明显就是一个不符合实际的情况。

所以可以用过\g<number>的方式来选择保留组

In [4]: template = re.compile(r"(?P<First>timeline/profile/)(\d*)(?P<Second>\.js
   ...: on)")                                                                   

In [5]: template.sub(r'\g<Second>8888\g<First>', url) 

  当然通过设置组名的方式来选取也是一种非常不错的选择。

re真的是非常强大,只掌握一些简单的使用,真的不够,只能慢慢积累。

 

\

转义特殊字符(允许你匹配 '*''?', 或者此类其他),或者表示一个特殊序列;特殊序列之后进行讨论。

如果你没有使用原始字符串( r'raw' )来表达样式,要牢记Python也使用反斜杠作为转义序列;如果转义序列不被Python的分析器识别,反斜杠和字符才能出现在字符串中。如果Python可以识别这个序列,那么反斜杠就应该重复两次。这将导致理解障碍,所以高度推荐,就算是最简单的表达式,也要使用原始字符串。

上面的这个反斜杠又给我上了一课,在Python使用re中,务必在前面加上r,这样就可以避免Python字符串转义的过程,这个反斜杠就可以直接拿来被re所使用。举一个简单的示例吧,真的非常拗口

In [21]: s                                                                      
Out[21]: '\\'

In [22]: print(s)                                                               
\

In [23]: s                                                                      
Out[23]: '\\'

In [24]: re.sub('\\\\','a',s)                                                   
Out[24]: 'a'

In [25]: re.sub(r'\\','a',s)                                                    
Out[25]: 'a'

In [26]:    

  对于Python的字符串来说,\这个反斜杠的标志服是一个特殊的符号,对于re来说,同样是一个特殊的符号,所以,如果没有使用r,如果你向在re里面使用反斜杠\,你就需要写两个\\,所以四个\也就是\\\\可以匹配到一个字符反斜杠,真他妈累死了。

posted @ 2020-12-15 21:39  就是想学习  阅读(992)  评论(0)    收藏  举报