gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 02:37:47 25 4
gpt4 key购买 nike

我有一个函数返回一个字符串“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")?愚蠢的问题,也许吧

如果使用(“^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
- 它的类型是 <type 'str'>在 Python 2 和 <class 'str'> 中在Python 3中
- 其表示为 "r'^Six o\'clock\nJim'"
- 其值为 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个字符组成,\'n其中三个不同的字符,没有一个转义字符 \'和一个转义字符 \n就在其中。
该值与我们为名称为 rawS 的对象 rawS 获得的值完全相同。通过编写指令rawS = r'^Six o\'clock\nJim'
然后,我们可以获得正则表达式,其模式被写入r'....'形式的文件中。直接写r = re.compile(detect.match(pat).group(2))
在我的示例中,只有序列 \'\n在文件中写入的一系列字符中。但前面的所有内容对于 Escape Sequences 中的任何一个都有效。语言的。

换句话说,我们不必想知道一个函数的作用与表达式 r'^Six o\'clock\nJim' 相同。来自 STRING "r'^Six o\'clock\nJim'"值(value)r'^Six o\'clock\nJim' ,
我们直接得到r'^Six o\'clock\nJim'的结果作为 detect.match(pat).group(2) 捕获的字符串的值。

.

诺塔·贝尼

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

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

然后,我认为上面的代码在 Python 3 中和在 Python 2 中一样有效,因此文件以模式 'r' 打开。 。

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

.

阿法胡

关于Python 字符串文字到正则表达式对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18494991/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com