Python字符串文字到正则表达式对象 - python

我有一个返回字符串"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。
但是我觉得这只是一个廉价的黑客。

参考方案

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
-其类型在Python 2中为<type 'str'>在Python 3中为<class 'str'>
-其表示为"r'^Six o\'clock\nJim'"
-它的值是r'^Six o\'clock\nJim',也就是说,连续字符r'^Sixo,,\'clock\nJi
如果文件中有第二行,则末尾可能还会有“字符” m。在文件中写入的\n的末尾与其行尾之间也可能存在空白或制表符(谁知道?)。这就是为什么我关闭正则表达式模式以定义r'^Six o\'clock\nJim'检测的原因。
因此,我们可能会在感兴趣的字符之后获得其他可能的空白,制表符和换行符,然后如果执行[ \t]*$,我们将获得例如:

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

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

换句话说,我们不必怀疑某个函数的作用与值\n的STRING r'^Six o\'clock\nJim'中的EXPRESSION "r'^Six o\'clock\nJim'"相同,
我们直接将r'^Six o\'clock\nJim'的结果作为r'^Six o\'clock\nJim'捕获的字符串的值。

Nota Bene

在Python 2中,类型detect.match(pat).group(2)是有限字符集的类型。
它是文件读取内容的类型,在模式<type 'str'>和模式'r'下也可以打开。

在Python 3中,类型'rb'覆盖unicode字符。
但是与Python 3相反,以模式打开的文件的读取内容的类型为<class 'str'>
如果文件以模式'r'打开,则文件的类型为<type 'str'>

然后,我认为上面的代码在Python 3和Python 2中都可以正常工作,因此可以使用<class 'bytes'>模式打开该文件。

如果应使用'rb'打开文件,则应将正则表达式模式更改为'r'

阿法胡

在返回'Response'(Python)中传递多个参数 - python

我在Angular工作,正在使用Http请求和响应。是否可以在“响应”中发送多个参数。角度文件:this.http.get("api/agent/applicationaware").subscribe((data:any)... python文件:def get(request): ... return Response(seriali…

Python exchangelib在子文件夹中读取邮件 - python

我想从Outlook邮箱的子文件夹中读取邮件。Inbox ├──myfolder 我可以使用account.inbox.all()阅读收件箱,但我想阅读myfolder中的邮件我尝试了此页面folder部分中的内容,但无法正确完成https://pypi.python.org/pypi/exchangelib/ 参考方案 您需要首先掌握Folder的myfo…

R'relaimpo'软件包的Python端口 - python

我需要计算Lindeman-Merenda-Gold(LMG)分数,以进行回归分析。我发现R语言的relaimpo包下有该文件。不幸的是,我对R没有任何经验。我检查了互联网,但找不到。这个程序包有python端口吗?如果不存在,是否可以通过python使用该包? python参考方案 最近,我遇到了pingouin库。

Python ThreadPoolExecutor抑制异常 - python

from concurrent.futures import ThreadPoolExecutor, wait, ALL_COMPLETED def div_zero(x): print('In div_zero') return x / 0 with ThreadPoolExecutor(max_workers=4) as execut…

如何用'-'解析字符串到节点js本地脚本? - python

我正在使用本地节点js脚本来处理字符串。我陷入了将'-'字符串解析为本地节点js脚本的问题。render.js:#! /usr/bin/env -S node -r esm let argv = require('yargs') .usage('$0 [string]') .argv; console.log(argv…