python 中的反斜杠匹配的问题

关于反斜杠的匹配问题可以参考:

https://www.cnblogs.com/mzc1997/p/7689235.html

文章中提出了两个概念: 字符串转义和正则转义,我觉得是理解反斜杠的关键所在

1. 字符串转义

在一个字符串中 因为有\n\t 等特殊含义的字符存在,所以字符“\” 是转义字符(字符串转义),如果要取消其转义属性有两种方式:

1)再加一个转义字符:'\\'
2)使用原始字符串:r'\'

2. 正则转义

正则表达式中,因为有\d,\s 等表示特殊意义的字符存在,所以正则表达式中的“\” 也表示转义(正则转义),如果要取消其转义属性只有一种方式:

用两个'\'

其实Perl 正则表达式中匹配'\' 的确是用的‘\\’.

 

那么匹配'\' 的正则表达就很好理解了,因为正则表达式同时也是字符串,所以既要有字符转义,又要有正则表达式转义, 那就有两种方式:

'\\\\' 和

r'\\'

将字符串中的\\ 替换为\

a=r'3\\8\\9'

print(a)

3\\8\\9

c=re.sub(r'\\\\','\\\\',a)

c
Out[213]: '3\\8\\9'

print (c)
3\8\9

 

 

 

 

 

 

 

 举例:

再举一个反斜杠的例子,这是在用bs 抓取网页后得到字符串d 再将其转换成字典

    d=soup.find('div',{'class':'page-box house-lst-page-box'}).get('page-data')
    print("original is ",d," type is ",type(d))
    print("asic code is ",d.encode('ascii'))
    d=d.encode('ascii').decode('unicode-escape')
    print("before is ",d," type is ",type(d))
    d=re.sub(r"'",'',d)
    print("after sub is ", d," type is ",type(d))   
    exec(d)
    print("after exec is ", d," type is ",type(d))
    a=eval(d)
    print("after eval is ", a," type is ",type(a))

得到的结果如下:

原始得到的字符串中包含了'\', 这个反斜杠是为了转义', 将其转换为ascii code 发现的确原始字符串用了双斜杠,并且在‘ 前也用了斜杠表示转义。

通过d.encode(''asii').decode('unicode-escape') 可以将原始字符串中的斜杠去掉。

但是字符串中还包含了单引号,用sub 将其去掉。

执行eval 后被转换成字典格式。

 

original is  \'{"totalPage":2,"curPage":1}\'  type is  'str'>
asic code is  b'\\\'{"totalPage":2,"curPage":1}\\\''
before is  '{"totalPage":2,"curPage":1}'  type is  <class 'str'>
after sub is  {"totalPage":2,"curPage":1}  type is  <class 'str'>
after exec is  {"totalPage":2,"curPage":1}  type is  <class 'str'>
after eval is  {'totalPage': 2, 'curPage': 1}  type is  <class 'dict'>

 

 

strip() 和replace()

删除字符串中的换行, replace('\n','')

删除字符串首尾的空格, strip()

 

你可能感兴趣的:(python 中的反斜杠匹配的问题)