字符串标志“ u”和“ r”到底是做什么的,什么是原始字符串文字?
当问这个问题时 ,我意识到我对原始字符串不了解很多。 对于自称是Django培训师的人来说,这很糟糕。
我知道编码是什么,我知道什么是u''
本身并因为我得到的是Unicode的。
但是
r''
到底是做什么的? 它产生什么样的字符串?最重要的是,这到底是什么
ur''
吗?最后,有什么可靠的方法可以从Unicode字符串返回到简单的原始字符串?
啊,顺便说一句,如果你的系统和你的文本编辑器的字符集设置为UTF-8,并
u''
实际上做什么?
#1楼
“ u”前缀表示该值具有unicode
类型而不是str
类型。
带有“ r”前缀的原始字符串文字会转义其中的任何转义序列,因此len(r"\\n")
为2。由于它们转义了转义序列,因此您不能在字符串文字后加上单个反斜杠:这不是有效的转义序列(例如r"\\"
)。
“原始”不是该类型的一部分,它只是表示值的一种方式。 例如, "\\\\n"
和r"\\n"
是相同的值,就像32
, 0x20
,和0b100000
是相同的。
您可以使用unicode原始字符串文字:
>>> u = ur"\n"
>>> print type(u), len(u)
<type 'unicode'> 2
源文件编码仅决定如何解释源文件,否则不会影响表达式或类型。 但是, 建议避免使用非ASCII编码会改变含义的代码:
使用ASCII的文件(对于Python 3.0,则为UTF-8)应该没有编码cookie。 只有在注释或文档字符串需要提及需要使用Latin-1的作者姓名时,才应使用Latin-1(或UTF-8)。 否则,使用\\ x,\\ u或\\ U转义是在字符串文字中包含非ASCII数据的首选方法。
#2楼
python中的字符串有两种类型:传统的str
类型和更新的unicode
类型。 如果键入字符串文字,而前面没有u
,则将得到旧的str
类型,该类型存储8位字符,而前面带有u
,则将获得较新的unicode
类型,该类型可以存储任何Unicode字符。
r
根本不改变类型,它只是改变了字符串文字的解释方式。 如果没有r
,则将反斜杠视为转义字符。 使用r
,反斜杠被视为文字。 无论哪种方式,类型都是相同的。
ur
当然是Unicode字符串,其中反斜杠是文字反斜杠,而不是转义码的一部分。
您可以尝试使用str()
函数将Unicode字符串转换为旧字符串,但是如果有任何Unicode字符无法在旧字符串中表示,则会出现异常。 如果愿意,可以先用问号替换它们,但是当然这会导致这些字符不可读。 如果要正确处理unicode字符,建议不要使用str
类型。
#3楼
实际上并没有任何“原始字符串 ”。 有原始字符串文字 ,它们恰好是在引号前用'r'
标记的字符串文字。
“原始字符串文字”与字符串文字的语法略有不同,其中反斜杠\\
表示“只是反斜杠”(除非在引号之前出现否则将终止该文字)–没有用于表示换行符,制表符,退格键,换页符等的“转义序列”。 在普通的字符串文字中,每个反斜杠必须加倍,以避免被当作转义序列的开始。
之所以存在此语法变体,主要是因为正则表达式模式的语法带有反斜杠(但不会在结尾处加重),但是上面的“ except”子句无关紧要,当您避免将它们每个加倍时,它看起来会更好一些- - 就这样。 表达本机Windows文件路径(使用反斜杠代替其他平台上的常规斜杠)也引起了人们的欢迎,但这很少需要(因为正常斜杠在Windows上也可以正常工作)并且不完美(由于“ except”子句)以上)。
r'...'
是字节字符串(在Python 2. *中), ur'...'
是Unicode字符串(同样在Python 2. *中),其他三种引用中的任何一种也可以精确地产生相同类型的字符串(例如r'...'
, r'''...'''
, r"..."
, r"""..."""
都是字节字符串,并且依此类推)。
不确定您“ 返回 ”的意思-本质上没有前后方向,因为没有原始字符串类型 ,它只是一种表示完全正常的字符串对象,字节或Unicode的替代语法。
是的,在Python 2 *, u'...'
是当然总是从不同的只是'...'
-前者是一个unicode字符串,后者是一个字节的字符串。 文字表达的编码方式可能是完全正交的问题。
例如,考虑一下(Python 2.6):
>>> sys.getsizeof('ciao')
28
>>> sys.getsizeof(u'ciao')
34
Unicode对象当然会占用更多的存储空间(很短的字符串,很明显,;-差别很小)。
#4楼
让我简单地解释一下:在python 2中,您可以将字符串存储为2种不同的类型。
第一个是ASCII ,它是python中的str类型,它使用1个字节的内存。 (256个字符,将主要存储英语字母和简单符号)
第二种类型是UNICODE ,它是python中的unicode类型,它使用2个字节的内存。 (65536个字符,因此包括地球上所有语言的所有字符)
默认情况下,python将更喜欢str类型,但是如果您想将字符串存储为unicode类型,则可以将u置于u'text'之类的文本前面,也可以通过调用unicode('text')
因此,u是刚刚打电话投STR功能为Unicode一小段路。 而已!
现在r部分,将其放在文本前面以告诉计算机该文本是原始文本,反斜杠不应是转义字符。 r'\\ n'不会创建换行符。 只是包含2个字符的纯文本。
如果要将str转换为unicode并将原始文本也放入其中,请使用ur,因为ru会引发错误。
现在,重要的部分:
您不能使用r来存储一个反斜杠,这是唯一的例外。 因此,此代码将产生错误: r'\\'
要存储反斜杠(仅一个),您需要使用“ \\\\”
如果要存储1个以上的字符,则仍可以使用r,如r'\\\\'一样,将产生2个反斜杠,如您所愿。
我不知道r无法与一个反斜杠存储一起使用的原因,但是至今尚未有人描述。 我希望这是一个错误。
#5楼
也许这很明显,也许不是,但是您可以通过调用x = chr(92)来使字符串“ \\”
x=chr(92)
print type(x), len(x) # <type 'str'> 1
y='\\'
print type(y), len(y) # <type 'str'> 1
x==y # True
x is y # False
#6楼
Unicode字符串文字
Unicode字符串文字(带u
前缀的字符串文字)在Python 3中不再使用 。它们仍然有效,但仅出于与Python 2 兼容的目的 。
原始字符串文字
如果要创建仅由易于键入的字符(例如英文字母或数字)组成的字符串文字,则只需键入以下内容即可: 'hello world'
。 但是,如果您还想包含一些其他奇特的字符,则必须使用一些解决方法。 解决方法之一是转义序列 。 这样,例如,您只需在字符串文字中添加两个易于键入的字符\\n
即可在字符串中表示新行。 因此,当您打印'hello\\nworld'
字符串时,单词将打印在单独的行上。 非常方便!
另一方面,在某些情况下,您想创建一个包含转义序列的字符串文字,但又不希望它们由Python解释。 您希望它们变得生硬 。 看下面的例子:
'New updates are ready in c:\windows\updates\new'
'In this lesson we will learn what the \n escape sequence does.'
在这种情况下,您可以在字符串文字前加上r
字符,例如: r'hello\\nworld'
,Python不会解释任何转义序列。 字符串将完全按照您创建的样子打印。
原始字符串文字不是完全“原始”吗?
许多人期望原始字符串文字是原始的,因为“ Python会忽略引号之间的任何内容” 。 那是不对的。 Python仍然可以识别所有转义序列,只是不解释它们-而是使它们保持不变。 这意味着原始字符串文字仍然必须是有效的字符串文字 。
根据字符串文字的词汇定义 :
string ::= "'" stringitem* "'"
stringitem ::= stringchar | escapeseq
stringchar ::= <any source character except "\" or newline or the quote>
escapeseq ::= "\" <any source character>
很明显,包含单引号字符: 'hello'world'
或以反斜杠: 'hello world\\'
结尾的字符串文字(无论是否原始)都是无效的。
#7楼
“原始字符串”表示将其存储为原样。 例如, '\\'
仅是反斜杠,而不是转义 。
字符串标志“ u”和“ r”到底是做什么的,什么是原始字符串文字?相关推荐
- C++ R 原始字符串 R 表示方法,R是原始字符串
新的C++标准可以在代码里嵌入一段原始字符串,该原始字符串不作任何转义,所见即所得,这个特性对于编写代码时要输入多行字符串,或者含引号的字符串提供了巨大方便. 先介绍特性如下: 原始字符串的开始符号 ...
- R语言length函数计算向量、列表、字符串长度实战
R语言length函数计算向量.列表.字符串长度实战 目录 R语言length函数计算向量.列表.字符串长度实战 #基本语法
- R将因子类型(Factor)转化为字符串类型(Character)
R将因子类型(Factor)转化为字符串类型(Character) 目录 R将因子类型(Factor)转化为字符串类型(Character)
- 艺赛旗(RPA)新手课堂 - 原始字符串为什么不能以反斜杠结尾
艺赛旗 RPA8.0全新首发免费下载 点击下载 http://www.i-search.com.cn/index.html?from=line1 详细内容请参看艺赛旗官网支持栏目:RPA社区 点击链接 ...
- 【Python入门教程】第78篇 原始字符串
本篇我们介绍一下 Python 中的原始字符串(raw strings ),它可以将字符串中的反斜线当作普通字符处理. 原始字符串 在 Python 中,以字母 r 或者 R 作为前缀的字符串,例如 ...
- 原始字符串(Raw String)
来自<Python宝典>的笔记 1.原始字符串是Python中一类比较特殊的字符串,以大写字母R或者小写字母r开始.在原始字符串中,字符"\" 不再表示转义字符的含义. ...
- C# 11新特性之原始字符串
朋友们大家好,我是Rector,码友网的创建者和维护者,专注C#&.NET技术开发. 本文为大家分享的主题是<C# 11新特性之原始字符串>,本文相应的视频: C# 11新特性-原 ...
- get_magic_quotes_gpc() 你到底是做什么的?
get_magic_quotes_gpc() 你到底是做什么的? 在php的配置文件中,有个布尔值的设置,就是magic_quotes_runtime,当它打开时, php的大部分函数自动的给从外部引 ...
- CSDN ARIMA R语言_SPSS做不了主成分分析,那就换R语言实现全过程吧
SPSS只能完成主成分分析的一部分环节,主成分得分等计算尚需结合其他工具(如Excel)来完成,这对SPSS用户来说,是极不方便的.我们一定要很清楚的知道,SPSS可以一条龙做因子分析,但不能通过菜单 ...
最新文章
- IT技术人生路之我的大学--我技术方向的转变
- 【并发编程】并发编程的三大特性
- RHEL7.0 DNS服务配置
- PHP-代码审计-文件读取(下载)
- C++vector容器-插入和删除
- 我的osu游戏程序设计(oo)
- Qt文档阅读笔记-Text QML Type官方解析及实例
- 我在自学python_我要自学python 自动化-request库
- springboot 项目 测试环境在独立的tomcat部署
- 如何从右键弹出菜单中清空删除数据加清空前提问确定
- 微博java敏感词_新浪微博的敏感词是哪些?
- .net core | donet core IIS 文件路径问题
- 如何玩好微信十亿流量?微趋道教你小程序推广最全攻略!
- EMC、Pure和NetApp推新品,NAS闪存场景在哪里
- BlogsToWordPress v16.9 – 将(新版)百度空间,网易163,新浪sina,QQ空间,人人网,CSDN,搜狐Sohu,博客大巴Blogbus,天涯博客,点点轻博客等博客搬家到Wor
- 一条命令在 Ubuntu 中安装所有基本的媒体编解码器
- PCL-SISR:基于对比学习的单幅图像超分辨率重建方法
- bzoj1758 [Wc2010]重建计划
- Linux-2022版(尚硅谷)-Day01(全网最全笔记)
- 尝到“线下”的甜,但随行付也吃到了模式的苦