3

我有一个函数返回一个"r'^A Plat'"写入文本文件的字符串

get_Pat(file)
    #process text file and now returns "r'^A Plat'"

最初,我将它硬编码在代码中。

pat = r'^A Plat'
use(pat)

现在

pat = get_Pat(file)
use(pat)

但它抱怨,因为我认为它的字符串而不是正则表达式对象。

我努力了

re.escape(get_Pat(file))

re.compile(get_Pat(file))

但它们都不起作用

如何将字符串文字转换为正则表达式对象?

r'^A Plat' 是否等同于简单的 re.compile("A Plat")?? 愚蠢的问题,也许

use("^A Plat'")
如果它的use("r'^A Plat'") <--- get_Pat(file) 吐出的东西不起作用,它会起作用

我想我的任务只是将字符串 r'^A Plat' 转换为 ^A Plat。
但我觉得它只是一个廉价的黑客。

4

4 回答 4

2

from ast import literal_eval
pat = literal_eval(get_Pat(file))

.

编辑

艾伦,

正如您在评论中所写,您无法导入literal_eval(),我的上述解决方案对您毫无用处。此外,虽然表达了有趣的信息,但其他答案并没有带来另一种解决方案。
所以,我建议一个新的,而不是使用literal_eval().

import re

detect = re.compile("r(['\"])(.*?)\\1[ \t]*$")

with open('your_file.txt') as f:
    pat = f.readline()

if detect.match(pat):
    r = re.compile(detect.match(pat).group(2))
else:
    r = re.compile(pat)

.

说明:

.

假设有连续的字符r'^Six o\'clock\nJim'写为 *your_file* 的第一行

*your_file* 的第一行的打开和读取创建了一个对象pat
- 它的 TYPE<type 'str'>在 Python 2 中和<class 'str'>在 Python 3 中
- 它的 REPRESENTATION 是"r'^Six o\'clock\nJim'"
- 它的 VALUE 是r'^Six o\'clock\nJim',也就是说连续的字符r, ', ^, S, i, x, , o, \, ', c, l, o, c, k, \, n, J, i,如果文件中有第二行,末尾m
可能还有“字符” 。\n并且可能还有空格或制表符,谁知道呢?r'^Six o\'clock\nJim'写在文件和它的行尾。这就是我关闭正则表达式模式以定义检测的原因[ \t]*$
因此,我们可能会在感兴趣的字符之后获得可能的额外空格、制表符和换行符,然后如果我们这样做,print tuple(pat)我们将获得例如:

('r', "'", '^', 'S', 'i', 'x', ' ', 'o', '\\', "'", 'c', 'l', 'o', 'c', 'k', '\\', 'n', 'J', 'i', 'm', "'", ' ', ' ', ' ', '\t', '\n')

.

现在,让我们考虑使用表达式 获得的对象detect.match(pat).group(2)
其值为^Six o\'clock\nJim ,由 18 个字符组成,并且\是其中三个不同的字符,其中没有一个转义字符和一个转义字符。这个值与我们通过编写指令获取name的对象rawS 得到的值完全相同然后,我们可以通过直接 编写来获取其模式写入文件中的正则表达式在表单下, 在我的示例中,只有序列和写入文件的一系列字符。但是前面的所有内容都适用于任何转义序列'n\'\n
rawSrawS = r'^Six o\'clock\nJim'
r'....'r = re.compile(detect.match(pat).group(2))
\'\n 的语言。

换句话说,我们不必怀疑一个函数会与valuer'^Six o\'clock\nJim'的 STRING 中的 EXPRESSION 做同样的事情, 我们直接将结果作为 捕获的字符串的值。 "r'^Six o\'clock\nJim'"r'^Six o\'clock\nJim'
r'^Six o\'clock\nJim'detect.match(pat).group(2)

.

诺塔贝内

在 Python 2 中,类型<type 'str'>是有限的字符集的类型。
它是文件读取内容的类型,用 mode 和 mode'r'一样打开'rb'

在 Python 3 中,该类型<class 'str'>涵盖了 unicode 字符。
但是与 Python 3 不同的是,使用 mode 打开的文件的读取内容'r'是 type ,而如果使用 mode 打开文件<type 'str'>
,则它是 type 。<class 'bytes'>'rb'

然后,我认为上面的代码在 Python 3 中和在 Python 2 中一样有效,所以这样的文件是用 mode 打开的'r'

如果应该使用正则表达式模式打开文件,则应将'rb'其更改为b"r(['\"])(.*?)\\1[ \t]*\r?\n".

.

阿飞虎

于 2013-08-28T18:38:47.077 回答
2

r'^A Plat''^A Plat'没有r. r代表raw ,而不是正则表达式。它使您可以编写带有特殊字符的字符串,例如\无需转义它们。

>>> r'^A Plat'
'^A Plat'
>>> r'/ is slash, \ is backslash'
'/ is slash, \\ is backslash'
>>> r'write \t for tab, \n for newline, \" for double quote'
'write \\t for tab, \\n for newline, \\" for double quote'

编写正则表达式时通常使用原始字符串,因为正则表达式通常包含反斜杠,否则需要转义。但是,不会r创建正则表达式对象。

Python 手册

§ 2.4.1。字符串文字

字符串文字可以选择以字母'r''R';为前缀 此类字符串称为原始字符串,并使用不同的规则来解释反斜杠转义序列。

...

除非出现'r'or'R'前缀,否则字符串中的转义序列将根据与标准 C 使用的规则类似的规则进行解释。

于 2013-08-28T18:06:44.540 回答
2

不确定您所说的“它们都不起作用”是什么意思,但是re.compile()您正在寻找的是:

>>> def getPat():
...     return r'^A Plat'
...
...
>>> getPat()
'^A Plat'
>>> reObj = re.compile(getPat())
>>> reObj
<_sre.SRE_Pattern object at 0x16cfa18>
>>> reObj.match("A Plat")
<_sre.SRE_Match object at 0x16c3058>
>>> reObj.match("foo")

编辑:

r' '使用以下代码返回后,您可以摆脱多余的杂物:

>>> s = "r'^A Plat'"
>>> s = s[1:].strip("'")
>>> s
'^A Plat'
于 2013-08-28T18:18:36.143 回答
1

根据您的 get_pat 函数中的评论,它返回:

“r'^A Plat'”

这不是你认为你得到的:

>>> x = re.compile("r'^A Plat'")
>>> y = "A Plat wins"
>>> x.findall(y)
[]
>>> x = re.compile("^A Plat")
>>> x.findall(y)
['A Plat']
>>>

所以你使用的正则表达式不是 r'^A Plat' 它的 "r'^A Plat'", r'^A Plat' 很好:

>>> x = re.compile(r'^A Plat')
>>> x.findall(y)
['A Plat']

要解决此问题,我首先必须了解您如何获得字符串“r'^A Plat'”。

于 2013-08-28T18:19:22.057 回答