【问题标题】:Turn list with strings in list with raw strings在带有原始字符串的列表中打开带有字符串的列表
【发布时间】:2018-09-07 09:01:56
【问题描述】:

我正在做一个项目,以便学习和开发我的 Python 3 代码功能。在这个项目中,我需要带有路径的原始字符串。

示例:

rPaths = [r"Path to the app", r"C:\\Program Files (x86)\\MAGIX\\MP3 deluxe 19\\MP3deluxe.exe", r"F:\\VLC\\vlc.exe"]

我还需要从另一个仅包含普通列表的列表中实现这一点:

Paths = ["Path to the app", "C:\\Program Files (x86)\\MAGIX\\MP3 deluxe 19\\MP3deluxe.exe", "F:\\VLC\\vlc.exe"]

为了实现这一点,我尝试了以下方法:

rPaths1 = "%r"%Paths

rPaths2 = [re.compile(p) for p in Paths]

rPaths3 = ["%r"%p for p in Paths]

结果不理想:

>>>print(Paths)
['Path to the app', 'C:\\Program Files (x86)\\MAGIX\\MP3 deluxe 19\\MP3deluxe.exe', 'F:\\VLC\\vlc.exe']

>>>print(rPaths)
['Path to the app', 'C:\\\\Program Files (x86)\\\\MAGIX\\\\MP3 deluxe 19\\\\MP3deluxe.exe', 'F:\\\\VLC\\\\vlc.exe']

>>>print(rPaths1)
['Path to the app', 'C:\\Program Files (x86)\\MAGIX\\MP3 deluxe 19\\MP3deluxe.exe', 'F:\\VLC\\vlc.exe']

>>>print(rPaths2)
[re.compile('Path to the app'), re.compile('C:\\Program Files (x86)\\MAGIX\\MP3 deluxe 19\\MP3deluxe.exe'), re.compile('F:\\VLC\\vlc.exe')]

>>>print(rPaths3)
["'Path to the app'", "'C:\\\\Program Files (x86)\\\\MAGIX\\\\MP3 deluxe 19\\\\MP3deluxe.exe'", "'F:\\\\VLC\\\\vlc.exe'"]

谁能帮帮我?

我不想导入任何东西。

【问题讨论】:

  • 请注意,原始字符串仅存在于源代码中。程序执行后,原始字符串就是字符串。原始字符串只是在 Python 文件中编写包含反斜杠的字符串的一种更简单的方法,而不是另一种字符串。请注意,打印字符串列表将打印列表中字符串的repr,而打印字符串本身将打印str,如果字符串包含文字反斜杠,则可能会有所不同。
  • '原始字符串'一旦被评估,就只是字符串。没有特殊对象是原始字符串。不需要进一步的“转换”。您遇到的问题是您在原始字符串中使用了反斜杠转义 \\ 。使用原始字符串时,\\ 被视为文字。然后,转义版本(如repr所示)看起来像\\\\ --
  • 我知道它们的解释方式相同。我可以轻松地将所有 \\ 更改为 \\\\。但是,这不是目标。这是将字符串列表转换为包含被解释为原始字符串的字符串的列表,这样我(也不是用户)必须将 \\ 更改为 \\\\。手动或在代码内部。 @sytech
  • 我不明白你想要获得什么。你能提供一个minimal reproducible example
  • @Pitto 我会试试的。提供了一个列表 'list = ["\a", "\b", "\c"]' 我正在尝试使用这样的代码来创建另一个具有相同元素的列表,但将它们解释为原始字符串 'rlist = [r "\a", r"\b", "\c"]' 这篇文章展示了一些我尝试过但没有成功实现目标的方法。将\更改为\\可以解决。然而,这不是故意的。

标签: python python-3.x list rawstring


【解决方案1】:

原始字符串只是字符串。路径可以以相同的方式使用,只要它们包含正确的字符。

>>> raw_strings = [r'Paths', r'C:\Program Files\Something']
>>> non_raw_strings = ['Paths', 'C:\\Program Files\\Something']
>>> raw_strings == non_raw_strings
True
>>> raw_strings[1]
'C:\\Program Files\\Something'
>>> print(raw_strings[1])
C:\Program Files\Something

但是,如果将反斜杠加倍并且使用原始字符串,则会得到不同的字符串:

>>> r'C:\Program Files\Something' == r'C:\\Program Files\\Something'
False

您可能会感到困惑的部分原因是print 使用list 对象将使用repr 来格式化列表中的项目,并且交互式Python 提示符还将使用repr 来格式化字符串。这意味着包含单个反斜杠的字符串可能看起来 像包含两个反斜杠。但不要上当:

>>> one_backslash_char = '\\'
>>> len(one_backslash_char)
1
>>> one_backslash_char
'\\'
>>> print(one_backslash_char)
\
>>> list_containing_string = [one_backslash_char]
>>> print(list_containing_string)
['\\']
>>> list_containing_string[0]
'\\'
>>> print(list_containing_string[0])
\

如果您的目标是将字符串与正则表达式一起使用,并且您希望将对正则表达式语法有意义的字符(例如\)转换为正则表达式匹配相应文字的形式(例如您有@987654330 @,你想匹配\,所以字符串需要包含\\),那么你想要的函数就是re.escape(string),它就是这样做的。

【讨论】:

  • 我知道字符串和原始字符串是一样的。那不是问题。我想按原样使用路径。不更改反斜杠。它可以通过将路径作为原始字符串或将反斜杠加倍来实现。我不想加倍反斜杠。我的问题是:是否可以将“r”放在列表中的每个字符串之前?如果是,怎么做?
  • 我知道字符串和原始字符串是一样的。那不是问题。我想按原样使用路径。不更改反斜杠。它可以通过将路径作为原始字符串或将反斜杠加倍来实现。我不想加倍反斜杠。我的问题是:是否可以将“r”放在列表中的每个字符串之前?如果是,如何?我知道它们可能看起来一样。我明白那个。但事实并非如此。即使没有打印 ii,当它在代码中进一步使用时,它也不起作用,因为反斜杠没有被转义。
  • 没有。 Python 的语法在你的代码开始执行之前就已经被解析了。因此,如果您没有 r 前缀,则在首先创建字符串对象之前,字符串中的任何转义都会被解析为它们形成的任何字符(和/或可能生成错误)。
  • @user460647:如果您的目标是将此字符串与正则表达式一起使用,那么您可能正在寻找re.escape()?请参阅我编辑的答案。
  • 我刚刚尝试了 re.escape,但它并没有按我的预期工作。无论是在打印时,还是在代码中进一步使用它时。当我将反斜杠加倍或手动将 r 放在字符串之前时,该代码有效。感谢您的帮助。
【解决方案2】:

如果我明白这一点,您想使用re.compile 匹配某个路径,但这不是它的工作原理。根据documentation,你应该试试这个:

prog = re.compile(pattern)
result = prog.match(string)

在你的情况下,我会尝试

for pattern in rPaths:
    prog = re.compile(pattern)
    rPaths2 = [prog.match(string) for string in Paths]

同样,不能 100% 确定您的问题到底是什么。这有帮助吗?

【讨论】:

  • 我刚试过,结果不是预期的。很抱歉没有让自己清楚。我想要的是将字符串(例如:“\a”,“\b”)转换为原始字符串(例如:r“\a”,r“\b”)。这是为了逃避反斜杠(“\”)。一种可行的方法是用另一个转义反斜杠(例如:“\\a”,“\\b”)。这可以很容易地编码,或者我也可以在每次插入路径时手动执行此操作。然而,这不是预期的。目的是使用原始字符串,而不是更改反斜杠。还有一件事要记住:字符串在列表中。
猜你喜欢
  • 1970-01-01
  • 2013-10-21
  • 2017-03-09
  • 2014-01-06
  • 2019-08-05
  • 2021-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多