正则表达式 反斜杠的匹配 2018-11-30

问题引入:

在学习正则表达式的过程中,遇到了一直无法正确匹配反斜杠\,初始使用的是下面两种方法:

  • 使用普通字符串,匹配一个反斜杠,需要再用一个反斜杠来转义:\\
  • 使用带r的原始字符串,这样就不用再转义:r‘\‘

使用上面两种方法一直无法匹配 4\5 中的反斜杠,最终经过查询,发现自己理解错误,字符串存在转义,正则也存在转义

1. 字符串转义:

在字符串中,我们会用一反斜杠加特定的字符来表达一些特定的功能,比如,\n表示换行,\"表示双引号等等,而如果要输出反斜杠本身,则用\\如下所示:

>>> str="\"Hello\\\nWorld\""
>>> print(str)
"HelloWorld"

可以看到,先是\"被转义成了一个双引号",然后是\\转义成\,然后\n转义为换行,最后是\"转义成". (这里不会二次转义,比如\\n,只会转义成\n,不会再次将\n转义成换行)

但当你在字符串前面加一个r,表示初始字符串,此时解释器将不对字符串里面的特殊字符进行转义,最外层双引号里面是什么内容,即为什么样的内容,所见即所得

>>> str=r"\"Hello\\\nWorld\""
>>> print(str)
\"Hello\\\nWorld\"

2. 正则转义:

在正则表达式中会使用一些通配符,比如\w表示匹配字母,数字或者下划线;\s表示空白字符;\d匹配数字

因此,若要实现正则转义,首先要保证模式字符串里面有反斜杠:

  • 比如字符串\n,里面就没有反斜杠,因为反斜杠连同后面的 n 已经被字符串转义成 换行;
  • 字符串\d,这里面是存在反斜杠的,因为字符串转义里面\d没有特定功能,所以仍然保留\d,然后正则转义在根据得到的\d进行转义,得到数字匹配。
  • 对于使用原始字符串r的,此时就是将整个初始字符串传给模式字符串;比如r‘\n‘,此时就是将整个\n传递给正则表达式
>>> x = re.compile(‘\n‘) #先是字符串转义成回车,匹配回车
>>> print(x.search(‘abc\nabc‘)) #提供的是 回车
<re.Match object; span=(3, 4), match=‘\n‘> # 因此能匹配到

>>> x = re.compile(r‘\n‘) #匹配 \n 2个字符
>>> print(x.search(‘abc\nabc‘)) #提供的是 回车,即 \n 2个字符
<re.Match object; span=(3, 4), match=‘\n‘> #因此能匹配到
>>> print(x.search(r‘abc\nabc‘)) #提供的是正则里面的 \n 两个字符,会被回转成 \\n
None

>>> x = re.compile(‘\\n‘) #匹配 \n 两个字符
>>> print(x.search(r‘abc\nabc‘)) #提供的是正则里面的 \n 两个字符,会被回转成 \\n
None

>>> x = re.compile(r‘\\n‘)  #匹配 \\n 三个字符
>>> print(x.search(r‘abc\nabc‘)) #提供的正则里面的 \n两个字符,会被回转成 \\n
<re.Match object; span=(3, 5), match=‘\\n‘> #因此能匹配到

3. 总结:

因此,正则表达式的解释分为两部分:

  • 第一步,字符串进行转义,将转义后的结果传给模式字符串
  • 第二步,正则对得到的模式字符串进行转义,然后再进行匹配

实例:匹配类似于 4\8 这样的串

可以分析:

  • 如果前面没有r, 先匹配数字,正则里面需要\d+,因此字符串里面需要提供\\d+(先在字符串中将\\转义为\, 然后再与\d+一起传给正则表达式)或者\d+(因为在字符串里面\d不代表其他含义,因此会将\d直接传给正则表达式),再匹配反斜杠,正则里面需要\\, 则字符串转义需要使用\\\\;最后再是后面的数字:\\d+
  • 如果有r,则无需进行字符串转义,因此正则里面需要反斜杠只需提供供正则转义的\\即可;因此为r‘\d+\\\d+‘
>>> x=re.compile(‘\d+\\\\\d+‘)
>>> print(x.search(‘3\8‘))
<re.Match object; span=(0, 3), match=‘3\\8‘>

>>> x=re.compile(r‘\d+\\\\\d+‘)
>>> print(x.search(‘3\8‘))
None
>>> x=re.compile(r‘\d+\\\d+‘)
>>> print(x.search(‘3\8‘))
<re.Match object; span=(0, 3), match=‘3\\8‘>

-----------------------------------------------------------------------------------------------------------

下面注意一个小问题:

用以上的正则表达式来查询3\5是查询不到的,比如:

>>> x=re.compile(‘\\d+\\\\\\d+‘)
>>> print(x.search(‘3\5‘))
None
>>> print(x.search(‘3\8‘))
<re.Match object; span=(0, 3), match=‘3\\8‘>

不仅如此,3/1, 3/2``3/3, 3/4, 3/5, 3/6, 3/7,都查不到

但是,3/8, 3/9可以查询到,接着 3/10查询不到

因此可以判断出这个肯定是与8有关的,反斜杠后面的数值不能超过8

经过查询发现,反斜杠加8进制数字表示转义字符:

转义字符以反斜‘‘开头,后面跟一个字符或一个八进制或十六进制数表示

>>> print(‘\101‘) #101即10进制的65
A

-----------------------------------------------------------------------------------------------------------

因此查询不到的原因是被\5被解释器自动转义了,而我们这里不需要对其进行转义,因此可以在字符串前面加一个r

>>> x=re.compile(‘\\d+\\\\\\d+‘)
>>> print(x.search(‘3\10‘))
None
>>> print(x.search(r‘3\10‘))
<re.Match object; span=(0, 4), match=‘3\\10‘>
>>> print(x.search(r‘3\5‘))
<re.Match object; span=(0, 3), match=‘3\\5‘>

-----------------------------------------------------------------------------------------------------------

参考:Python正则表达式匹配反斜杠“”

原文地址:https://www.cnblogs.com/qiulinzhang/p/10045647.html

时间: 2024-10-06 09:41:21

正则表达式 反斜杠的匹配 2018-11-30的相关文章

python 正则表达式中反斜杠(\)的麻烦和陷阱

这里是一点小心得:由于下面两个原因,在正则表达式中使用反斜杠就会产生了一个双重转换的问题.(1).python自身处理字符串时,反斜杠是用于转义字符 (2).正则表达式也使用反斜杠来转义字符     要匹配字符串中1个反斜杠应该怎么写正则表达式?"\\",这样行吗?试试就知道了,re模块抛异常了,因为在正则表达式中,"\\"就是一个反斜杠,对于正则表达式解析器来说,是一个转义字符,但是后面啥也没有,自然就报错了,"\\\"三个肯定是不行的,试试四

python&#160;正则表达式中反斜杠(\)的麻烦和陷阱&#160;(转)

这里是一点小心得:由于下面两个原因,在正则表达式中使用反斜杠就会产生了一个双重转换的问题.(1).python自身处理字符串时,反斜杠是用于转义字符 (2).正则表达式也使用反斜杠来转义字符     要匹配字符串中1个反斜杠应该怎么写正则表达式?"\\",这样行吗?试试就知道了,re模块抛异常了,因为在正则表达式中,"\\"就是一个反斜杠,对于正则表达式解析器来说,是一个转义字符,但是后面啥也没有,自然就报错了,"\\\"三个肯定是不行的,试试四

python 中的反斜杠匹配的问题

关于反斜杠的匹配问题可以参考: https://www.cnblogs.com/mzc1997/p/7689235.html 文章中提出了两个概念: 字符串转义和正则转义,我觉得是理解反斜杠的关键所在 1. 字符串转义 在一个字符串中 因为有\n\t 等特殊含义的字符存在,所以字符“\” 是转义字符(字符串转义),如果要取消其转义属性有两种方式: 1)再加一个转义字符:'\\'2)使用原始字符串:r'\' 2. 正则转义 正则表达式中,因为有\d,\s 等表示特殊意义的字符存在,所以正则表达式中

Nginx之proxy_pass指令url反斜杠作用

在nginx中配置proxy_pass代理转发时,其后面的url中反斜杠/ 的匹配处理时常出现意想不到的问题发生,以下说明两种情况:(1)如果在proxy_pass后面的url加/,表示绝对根路径:(2)如果在proxy_pass后面的url没有/,表示相对路径,把匹配的路径部分也给代理走. 下面四种情况分别用 http://127.0.0.1/proxy/test.html 进行访问测试 第一种情况: location /proxy/ { proxy_pass http://127.0.0.1

正则表达式匹配反斜杠——匹配一个反斜杠要用四个反斜杠

正则表达式中匹配一个反斜杠要用四个反斜杠,为什么呢? 分析一下"\\\\",第一个斜杠是转义符,第二个斜杠是斜杠本身,第三个斜杠是转义符,第四个斜杠是斜杠本身. 有2点要清楚: 1.字符串里面表示斜杠就需要两个斜杠如"\\" 2.正则表达式里的斜杠需要转意,是用"\\"标示. 这样就比较好解释: 我们先要表示正则表达式里面的斜杠"\\",然后再用字符串表示出来.而这2个斜杠分别需要一个转义符,这样就成了4个斜杠在正则表达式里面

Python: 正则表达式匹配反斜杠 &quot;\&quot;

Python正则表达式匹配反斜杠 "\" eg: >>>a='w\w\w' 'w\\w\\w' #  打印出来的 "\\" 被转义成 一个反斜杠 "\" 如果需要匹配字符串a,需要匹配一个反斜杠 "\" >>>re.split(r'\\',a) ['w','w','w',] 先对字符串转义,再进行正则表达式转义 由于原始字符串中所有字符直接按照字面意思来使用,不转义特殊字符,故不做字符串转义

Python字符串和正则表达式中的反斜杠(&#39;\&#39;)问题

在Python普通字符串中 在Python中,我们用'\'来转义某些普通字符,使其成为特殊字符,比如 In [1]: print('abc\ndef') # '\n'具有换行的作用 abc defg In [2]: print('abc\tdef') # '\t'具有制位符的作用 abc defg 我们还可以用'\'来转义特殊字符,使其成为普通字符,比如 In [3]: print('abc\\tdef') # 使'\'成为一个普通的字符,没有转义作用 abc\tdef In [4]: prin

Python基础要点:字符串和正则表达式中的反斜杠(‘\‘)问题详解

给大家整理的是关于Python字符串和正则表达式中的反斜杠('\')问题以及相关知识点,有需要的朋友们可以学习下. 在Python普通字符串中 在Python中,我们用'\'来转义某些普通字符,使其成为特殊字符,比如 1 In [1]: print('abc\ndef') # '\n'具有换行的作用 2 abc 3 defg 4 5 In [2]: print('abc\tdef') # '\t'具有制位符的作用 6 abc defg 我们还可以用'\'来转义特殊字符,使其成为普通字符,比如 1

关于Python中正则表达式的反斜杠问题

之前总是搞不明白正则表达式中的反斜杠的问题.今天经过查阅资料终于搞明白了. 其中最重要的一点就是Python自己的字符串中定义的反斜杠也是转义字符,而正则表达式中的反斜杠也是转义字符,所以正则表达式中反斜杠会涉及到双重转换的问题. 要匹配字符串中1个反斜杠应该怎么写正则表达式?"\\",这样行吗?试试就知道了,re模块抛异常了,因为"\\"就是一个反斜杠,对于正则表达式解析器来说,是一个转义字符,但是后面啥也没有,自然就报错了,"\\\"三个肯定