当问这个问题时 ,我意识到我对原始字符串不了解很多。 对于自称是Django培训师的人来说,这很糟糕。

我知道编码是什么,我知道什么是u''本身并因为我得到的是Unicode的。

  • 但是r''到底是做什么的? 它产生什么样的字符串?

  • 最重要的是,这到底是什么ur''吗?

  • 最后,有什么可靠的方法可以从Unicode字符串返回到简单的原始字符串?

  • 啊,顺便说一句,如果你的系统和你的文本编辑器的字符集设置为UTF-8,并u''实际上做什么?


#1楼

“ u”前缀表示该值具有unicode类型而不是str类型。

带有“ r”前缀的原始字符串文字会转义其中的任何转义序列,因此len(r"\\n")为2。由于它们转义了转义序列,因此您不能在字符串文字后加上单个反斜杠:这不是有效的转义序列(例如r"\\" )。

“原始”不是该类型的一部分,它只是表示值的一种方式。 例如, "\\\\n"r"\\n"是相同的值,就像320x20 ,和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”到底是做什么的,什么是原始字符串文字?相关推荐

  1. C++ R 原始字符串 R 表示方法,R是原始字符串

    新的C++标准可以在代码里嵌入一段原始字符串,该原始字符串不作任何转义,所见即所得,这个特性对于编写代码时要输入多行字符串,或者含引号的字符串提供了巨大方便. 先介绍特性如下: 原始字符串的开始符号 ...

  2. R语言length函数计算向量、列表、字符串长度实战

    R语言length函数计算向量.列表.字符串长度实战 目录 R语言length函数计算向量.列表.字符串长度实战 #基本语法

  3. R将因子类型(Factor)转化为字符串类型(Character)

    R将因子类型(Factor)转化为字符串类型(Character) 目录 R将因子类型(Factor)转化为字符串类型(Character)

  4. 艺赛旗(RPA)新手课堂 - 原始字符串为什么不能以反斜杠结尾

    艺赛旗 RPA8.0全新首发免费下载 点击下载 http://www.i-search.com.cn/index.html?from=line1 详细内容请参看艺赛旗官网支持栏目:RPA社区 点击链接 ...

  5. 【Python入门教程】第78篇 原始字符串

    本篇我们介绍一下 Python 中的原始字符串(raw strings ),它可以将字符串中的反斜线当作普通字符处理. 原始字符串 在 Python 中,以字母 r 或者 R 作为前缀的字符串,例如 ...

  6. 原始字符串(Raw String)

    来自<Python宝典>的笔记 1.原始字符串是Python中一类比较特殊的字符串,以大写字母R或者小写字母r开始.在原始字符串中,字符"\" 不再表示转义字符的含义. ...

  7. C# 11新特性之原始字符串

    朋友们大家好,我是Rector,码友网的创建者和维护者,专注C#&.NET技术开发. 本文为大家分享的主题是<C# 11新特性之原始字符串>,本文相应的视频: C# 11新特性-原 ...

  8. get_magic_quotes_gpc() 你到底是做什么的?

    get_magic_quotes_gpc() 你到底是做什么的? 在php的配置文件中,有个布尔值的设置,就是magic_quotes_runtime,当它打开时, php的大部分函数自动的给从外部引 ...

  9. CSDN ARIMA R语言_SPSS做不了主成分分析,那就换R语言实现全过程吧

    SPSS只能完成主成分分析的一部分环节,主成分得分等计算尚需结合其他工具(如Excel)来完成,这对SPSS用户来说,是极不方便的.我们一定要很清楚的知道,SPSS可以一条龙做因子分析,但不能通过菜单 ...

最新文章

  1. IT技术人生路之我的大学--我技术方向的转变
  2. 【并发编程】并发编程的三大特性
  3. RHEL7.0 DNS服务配置
  4. PHP-代码审计-文件读取(下载)
  5. C++vector容器-插入和删除
  6. 我的osu游戏程序设计(oo)
  7. Qt文档阅读笔记-Text QML Type官方解析及实例
  8. 我在自学python_我要自学python 自动化-request库
  9. springboot 项目 测试环境在独立的tomcat部署
  10. 如何从右键弹出菜单中清空删除数据加清空前提问确定
  11. 微博java敏感词_新浪微博的敏感词是哪些?
  12. .net core | donet core IIS 文件路径问题
  13. 如何玩好微信十亿流量?微趋道教你小程序推广最全攻略!
  14. EMC、Pure和NetApp推新品,NAS闪存场景在哪里
  15. BlogsToWordPress v16.9 – 将(新版)百度空间,网易163,新浪sina,QQ空间,人人网,CSDN,搜狐Sohu,博客大巴Blogbus,天涯博客,点点轻博客等博客搬家到Wor
  16. 一条命令在 Ubuntu 中安装所有基本的媒体编解码器
  17. PCL-SISR:基于对比学习的单幅图像超分辨率重建方法
  18. bzoj1758 [Wc2010]重建计划
  19. Linux-2022版(尚硅谷)-Day01(全网最全笔记)
  20. 尝到“线下”的甜,但随行付也吃到了模式的苦

热门文章

  1. 配置sqlplus的AUTOTRACE
  2. 讲解开源项目:一步步跑起来个 Java 前后端分离的人力资源管理系统
  3. C#—接口和抽象类的区别?
  4. Kafka学习(一)
  5. react与微信小程序
  6. 原来数据库里的单引号是这么加进去的
  7. Ubuntu下LDAP 部署文档
  8. logstash收集nginx日志
  9. zabbix4.0 mysql本地数据库迁移到腾讯云数据库
  10. PowerShell 中执行 dir /b /s