python - 来自输出的表情符号在 Windows 和 Linux 上是不同的
问题描述
在 Windows 上:
import re
import subprocess
output = subprocess.run(['python', '-m', 'black'], stderr=subprocess.PIPE)
stderr = output.stderr.decode()
assert re.match(r'No Path provided. Nothing to do \\U0001f634\r\n', stderr)
然而,在 Linux 上,我需要在两个地方更改正则表达式:
import re
import subprocess
output = subprocess.run(['python', '-m', 'black'], stderr=subprocess.PIPE)
stderr = output.stderr.decode()
assert re.match(r'No Path provided. Nothing to do \U0001f634\n', stderr)
我明白为什么我需要更改\r\n
为\n
- 这是因为回车
但是,为什么我需要更改'\\U0001f634'
为'\U0001f634'
?有没有办法以跨平台的方式编写上述断言?
解决方案
这里出现差异的原因可能是因为 emoji 在 Windows 中显示为十六进制值,在 Linux 中显示为文字 emoji char。
这里的解决方案是通过在其后添加量词来匹配\r
为可选字符,?
并使用交替来匹配转义的表情符号或文字表情符号:
r'No Path provided. Nothing to do (?:\\U0001f634|\U0001f634)\r?\n'
如果点是文字点,请考虑转义它,否则.
匹配除换行符之外的任何字符:
r'No Path provided\. Nothing to do (?:\\U0001f634|\U0001f634)\r?\n'
细节
No Path provided. Nothing to do
- 文字No Path provided. Nothing to do
文本(?:\\U0001f634|\U0001f634)
-\
跟随U0001f634
或表情符号
\r?
- 一个可选的 CR\n
- 一个 LF 字符。
推荐阅读
- android - Android PrintDocumentAdapter 删除/隐藏另存为 pdf 选项
- tabs - Vaadin 选项卡:防止选择选项卡;仅以编程方式选择选项卡
- python - 不和谐蟒蛇多次狙击
- java - 同一实体的多个数据传输对象 (DTO)
- three.js - 如何在一直检测到没有标记的标记后播放ar中的内容(一次检测然后播放)
- pyspark - Pyspark:TypeError:+的不支持的操作数类型:'int'和'str'
- sql - 过滤多表mssql
- r - 根据设置的条件过滤
- json - TypeError: document 必须是 dict、bson.son.SON、bson.raw_bson.RawBSONDocument 的实例,或者是继承自 collections.MutableMapping 的类型
- reactjs - 在不使用外部 css 文件的情况下添加 css 悬停样式