小编典典

如何以独立于平台的方式为换行符派生一个字符串并在正则表达式模式中使用它?

all

我有一个关于如何在 Python 中将换行符表示为字符串的问题。我想我可以使用内置函数repr来实现这一点。所以我尝试通过运行以下代码来验证这种方法的可行性:

import os

lineBreakAsStr = repr(os.linesep)
print(f'lineBreakAsStr = {lineBreakAsStr}') # line 4
print(lineBreakAsStr == '\\r\\n')           # line 5

repr如果函数可以成功地将值转换为os.linesep字符串,我希望第 5 行的结果应该是“True” 。但在我的 Windows 7 PC 中,第 4 行的输出是“lineBreakAsStr = ‘\r\n’”,第 5 行的输出是“False”。

谁能向我解释为什么?我应该如何从值中获取代表换行符的字符串os.linesep并将其放入正则表达式模式中,而不是使用像’\r\n’这样的固定字符串?

下面是一个代码片段来演示我想要做什么。(相对于第14行的代码,我更喜欢使用第13行的代码。但是第13行的代码不起作用。必须以某种方式对其进行修改才能找到我要查找的子字符串。):

import os, re

def f(pattern, data):
  p =  re.compile(pattern)
  m = p.search(data)
  if m is not None:
    print(m.group())
  else:
    print('Not match.')

dataSniffedInConsole = ('procd: - init -\\\\r\\\\nPlease press Enter '
                        'to activate this console.\\\\r\\\\n')
lineBreakAsStr = repr(os.linesep)   # line 13
# lineBreakAsStr = '\\\\\\\\r\\\\\\\\n' # line 14

pattern = rf'Please press Enter to activate this console.{lineBreakAsStr}'

f(pattern, dataSniffedInConsole)

阅读 64

收藏
2022-07-27

共1个答案

小编典典

使用repr将在字符串周围加上引号。引号可能导致您的问题。

>>> newline = repr(os.linesep)
>>> print(newline)
'\\r\\n'
>>> newline == "'\\r\\n'"
True

快速解决您的问题是删除引号:

>>> newline = repr(os.linesep).strip("'")
>>> print(newline)
\\r\\n
>>> newline == "'\\r\\n'"
False
>>> newline == "\\r\\n"
True

我建议您找到一种从控制台读取原始数据而不是表示的方法。使用原始数据将更容易处理。

2022-07-27