Do
from ast import literal_eval
pat = literal_eval(get_Pat(file))
编辑
aelon,
正如你在评论中所写,你无法导入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)
解释:
.
假设在 *your_file* 的第一行写有字符序列 r'^六点钟\n吉姆'
打开并读取 *your_file* 的第一行会创建一个对象pat
- 它的类型在Python 2中为<type 'str'>
,在Python 3中为<class 'str'>
- 它的表示为"r'^六点钟\n吉姆'"
- 它的值为r'^六点钟\n吉姆'
,也就是由字符r
,'
,^
,六
,点
,钟
,\
,'
,吉
,姆
组成
如果文件中有第二行,则末尾可能还有“字符”\n
。此外,在文件中写入r'^六点钟\n吉姆'
和其行的末尾之间可能还有空格或制表符。因此,我使用[ \t]*$
关闭了正则表达式模式以定义detect。
因此,我们可能会在感兴趣的字符后获得可能的额外空格、制表符和换行符,如果我们执行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个字符组成,其中
\
和
'
以及
n
是其中的三个不同字符,其中没有一个转义字符
\'
和一个转义字符
\n
。
这个值与通过编写指令
rawS = r'^Six o\'clock\nJim'
获得的名称为
rawS
的对象的值完全相同。
然后,我们可以通过直接编写
r = re.compile(detect.match(pat).group(2))
来获得其模式以
r'....'
形式写入文件的正则表达式。
在我的示例中,序列
\'
和
\n
是文件中写的字符序列中唯一的序列。但是,所有前面的内容都适用于语言中的任何
转义序列。
换句话说,我们无需考虑与表达式
r'^Six o\'clock\nJim'
相同的函数,从值为
r'^Six o\'clock\nJim'
的字符串
"r'^Six o\'clock\nJim'"
的STRING中获得该函数,
我们直接将
detect.match(pat).group(2)
捕获的字符串的值作为
r'^Six o\'clock\nJim'
的结果。
注
在Python 2中,类型<type 'str'>
是一组有限的字符类型。
它是以模式'r'
和模式'rb'
打开的文件的读取内容的类型。
在Python 3中,类型<class 'str'>
涵盖了unicode字符。
但与Python 3相反,以模式'r'
打开的文件的读取内容是类型<type 'str'>
,
而如果使用模式'rb'
打开文件,则其类型为<class 'bytes'>
。
然后,我认为上面的代码在Python 3中与Python 2一样有效,因此应以模式'r'
打开该文件。
如果文件应以'rb'
打开,则正则表达式模式应更改为b"r(['\"])(.*?)\\1[ \t]*\r?\n"
。
.
AFAIHU
r
并不代表“正则表达式”或其他任何意思。这里存在多个误解。 - Karl Knechtel