首页 > 解决方案 > 来自输出的表情符号在 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'?有没有办法以跨平台的方式编写上述断言?

标签: pythonregexunicodesubprocesscross-platform

解决方案


这里出现差异的原因可能是因为 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 字符。

推荐阅读