正则表达式 \ 和 原生字符串 r
使用python写字符串常量时,raw string是个很好用的东东,比如在C里我要写一个Windows下的路径,得这么
写:
char *path = "C:\\mydir\\myfile.txt";
用"\"来转义成一个反斜杠字符。而在python下用raw string就不用这么麻烦了:
path = r"C:\mydir\myfile.txt"
一个r搞定,是不是很简单?
真的这么简单吗?未必。试试如果要指定一个目录名呢?
>>> path = r"C:\mydir\mysubdir\"
File "<string>", line 1
path = r"C:\mydir\mysubdir\"
^
SyntaxError: EOL while scanning single-quoted string
出错了吧。
这是一个常见的陷阱,在使用raw string时,反斜杠虽然不再做转义用,但它仍然保留了一部分“魔力”——保护字符串。如
>>> print r"abc\"xyz"
abc\"xyz
在反斜杠之后的那个引号由于反斜杠的魔力,不被视为字符串终结。那么对应到开头那个路径r"C:\mydir\mysubdir",最后那个引号也是由于反斜杠的魔力,不被视为终结,python认为其后应该还有东西,结果没有,就报错了。
那岂不是用raw string写Windows路径就很不方便了吗?
答案是:raw string本来就不是为了方便写Windows路径而设计的,而是为了方便写正则表达式设计的。在正则表达式中,反斜杠是转义字符,因此不可能出现以反斜杠结尾的正则表达式。
Windows路径的“正统”写法应该是:
path = os.path.normcase("c:/mydir/mysubdir/")
os.path.normcase在Windows平台下会自动把正斜杠转换成反斜杠。
由于正则表达式使用反斜杠来转义特殊字符,而python自身处理字符串时,反斜杠也是用于转义字符,这样就产生了一个双重转换的问题,要匹配字符串中1个反斜杠应该怎么写正则表达式?"\",这样行吗?试试就知道了,re模块抛异常了,因为"\"就是一个反斜杠,对于正则表达式解析器来说,是一个转义字符,但是后面啥也没有,自然就报错了,"\"三个肯定是不行的,试试四个"\\",完美匹配。
import re
re_str_patt = "\\\\"
reObj = re.compile(re_str_patt)
str_test = "abc\\cd\\hh"
print reObj.findall(str_test)
import re
re_str_patt = "\\\\"
reObj = re.compile(re_str_patt)
str_test = "abc\\cd\\hh"
print reObj.findall(str_test)
输出:['\\', '\\']
这里要这么理解,**首先第一重转换是字符串自身的转义,那么"\\\\",实际上就是表示两个反斜杠(两个字符),然后传入正则表达式解析器,因为反斜杠依然是转义字符,
那么进行第二重转换,两个反斜杠就代表一个反斜杠,所以就能和一个反斜杠进行匹配了**,那么匹配连续的两个反斜杠,写正则表达式时就要写8次"\"了,相当壮观,
要匹配/d+(这个在正则表达式里面表示连续1一个以上的数字字符)这个字符串怎么写呢?
view plaincopy to clipboardprint?
import re
re_str_patt = "\\\\d\\+"
print re_str_patt
reObj = re.compile(re_str_patt)
print reObj.findall("\\d+")
import re
re_str_patt = "\\\\d\\+"
print re_str_patt
reObj = re.compile(re_str_patt)
print reObj.findall("\\d+")
写成re_str_patt = "\\\\d\+"也行,因为\+对于字符串来说,没有转义意义,所以就当成一个反斜杠了。
在python中写正则表达式时用得最多的是raw字符串,**原生字符串,什么意思?就是只有一重转换了,没有字符串转换了,只在正则表达式内部进行转换了**,
这样匹配一个反斜杠的正则表达式可以这样写,re_str_patt =r"\\",有人会想,以后写windows的文件路径什么的方便了,呵呵直接 path = r"c:\myforder\xx"搞定,
是的,这句没有问题,但是如果你写成 path =r"c:\myforder\xx\",直接报错了,为什么?因为反斜杠虽然不作为转义字符了,但是还是对它后面的引号(包括单引号)有影响,
使这个引号不被视为字符串的终止,以为它后面还有字符,但是实际没有,因此会报错。其实可以反过来想raw字符串里面要表示引号怎么办呢?,
可以发现 path= r"\\123\"xxx" 是可以的,那用raw字符串岂不是有局限性?不过raw在设计之初就是用来支持正则表达式的,而在正则里面反斜杠是转义字符,
所以不可能出现在字符串的末尾的,所以建议不要图方便在其他的地方使用raw。
正则表达式 \ 和 原生字符串 r的更多相关文章
- android java 字符串正则表达式 分离特殊字符串
Java中正则表达式的使用 在Java中,我们为了查找某个给定字符串中是否有需要查找的某个字符或者子字串.或者对字符串进行分割.或者对字符串一些字符进行替换/删除,一般会通过if-else.for 的 ...
- regular expression (如何用Sed和正则表达式提取子字符串)
echo "mv u3_yunying.war u3_yunying.war_`date +%Y%m%d%H%M`" | sed "s/\(mv\) \(\w*.wa ...
- c++11 原生字符串字面值
c++11 原生字符串字面值 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #in ...
- 正则表达式、原始字符串及re
正则表达式.原始字符串及re re是python中的一个文本解析工具,常用的方法有: 来源:https://www.ibm.com/developerworks/cn/opensource/os-cn ...
- Java基础之一组有用的类——使用正则表达式搜索子字符串(TryRegex)
控制台程序. 正则表达式只是一个字符串,描述了在其他字符串中搜索匹配的模式.但这不是被动地进行字符序列匹配,正则表达式其实是一个微型程序,用于一种特殊的计算机——状态机.状态机并不是真正的机器,而是软 ...
- java正则表达式,将字符串中\后的第一个字母变成大写
java正则表达式,将字符串中\后的第一个字母变成大写 例子是比较简单,注意的是java中的“\\”意义是:我要插入一个正则表达式的反斜线,所以其后面的字符有特殊有意义.所以普通反斜线应该是" ...
- Vim正则表达式匹配替换字符串
/********************************************************************** * Vim正则表达式匹配替换字符串 * 说明: * 用V ...
- JavaScript 正则表达式RegExp 和字符串本身的正则表达式
JavaScript 正则表达式 正则表达式(英语:Regular Expression,在代码中常简写为regex.regexp或RE)使用单个字符串来描述.匹配一系列符合某个句法规则的字符串搜索模 ...
- js正则表达式,判断字符串是否以数字组结尾,并取出结尾的数字
js正则表达式,判断字符串是否以数字组结尾,并取出结尾的数字 <!DOCTYPE html> <html> <head> <meta charset=&quo ...
随机推荐
- CSS进阶知识
html { -ms-text-size-adjust: 100%; -webkit-text-size-adjust: 100%; text-size-adjust: 100%; } 该属性的作用是 ...
- ① 设计模式的艺术-01.单例(Singleton)模式
单例模式为何要出现 在工作过程中,发现所有可以使用单例模式的类都有一个共性,那就是这个类没有自己的状态,换句话说,这些类无论你实例化多少个,其实都是一样的. 如果我们不将这个类控制成单例的结构,应用中 ...
- 用sqoop将mysql的数据导入到hive表中
1:先将mysql一张表的数据用sqoop导入到hdfs中 准备一张表 需求 将 bbs_product 表中的前100条数据导 导出来 只要id brand_id和 name 这3个字段 数据存 ...
- TypeScript在react项目中的实践
前段时间有写过一个TypeScript在node项目中的实践. 在里边有解释了为什么要使用TS,以及在Node中的一个项目结构是怎样的. 但是那仅仅是一个纯接口项目,碰巧赶上近期的另一个项目重构也由我 ...
- 大端小端转换,le32_to_cpu 和cpu_to_le32
字节序 http://oss.org.cn/kernel-book/ldd3/ch11s04.html 小心不要假设字节序. PC 存储多字节值是低字节为先(小端为先, 因此是小端), 一些高级的平台 ...
- (转)USB体系结构
转载地址:http://blog.ednchina.com/zenhuateng/203584/Message.aspx USB总线接口层:物理连接.电气信号环境.信息包传输机制:主机一方由USB主控 ...
- MAC和PHY的区别
一块以太网网卡包括OSI(开方系统互联)模型的两个层.物理层和数据链路层.物理层定义了数据传送与接收所需要的电与光信号.线路状态.时钟基准.数据编码和电路等,并向数据链路层设备提供标准接口.数据链路层 ...
- rabbitmq集群搭建方法简介(测试机linux centos)【转】
本文将介绍四台机器搭建rabbitmq集群: rabbitmq IP和主机名(每台机器已安装RabbitMQ 3.5.6, Erlang 18.1) 192.168.87.73 localhost73 ...
- java线上应用故障排查之二:高内存占用【转】
前一篇介绍了线上应用故障排查之一:高CPU占用,这篇主要分析高内存占用故障的排查. 搞Java开发的,经常会碰到下面两种异常: 1.java.lang.OutOfMemoryError: PermGe ...
- URAL题解二
URAL题解二 URAL 1082 题目描述:输出程序的输入数据,使得程序输出"Beutiful Vasilisa" solution 一开始只看程序的核心部分,发现是求快排的比较 ...