做
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
rawS
rawS = 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"
.
.
阿飞虎