Python字符串文字到regex对象

时间:2013-08-28 17:57:00

标签: python regex

我有一个函数返回一个字符串"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(文件)正在吐出

,则无效

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

4 个答案:

答案 0 :(得分:2)

r'^A Plat'与没有'^A Plat'的{​​{1}}相同。 r代表原始,而非正则表达式。它允许您使用r之类的特殊字符编写字符串,而不必转义它们。

\

在编写正则表达式时通常使用原始字符串,因为正则表达式通常包含反斜杠,否则需要对其进行转义。 >>> 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' 会创建正则表达式对象。

来自Python manual

  

§2.4.1。字符串文字

     

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

     

...

     

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

答案 1 :(得分: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'

答案 2 :(得分: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'”。

答案 3 :(得分:1)

待办事项

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)

说明:

假设有一系列字符r'^Six o\'clock\nJim'被写为* your_file *

的第一行

* your_file *第一行的打开和读取会创建一个对象 pat
- 它的TYPE在Python 2中为<type 'str'>,在Python 3中为<class 'str'> - 其代表是"r'^Six o\'clock\nJim'"
- 其值为r'^Six o\'clock\nJim',即字符连续r'^Si,{{ 1}},xo\'cl,{{1} },ock\nJ
如果文件中有第二行,则最后可能还有“字符”i。并且在文件中写入的m的末尾和其行的末尾之间可能还有空格或制表符。这就是我关闭正则表达式模式以使用\n定义 detect 的原因 因此,我们可能会在感兴趣的字符后获得可能的其他空格和制表符以及换行符,然后如果我们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') ,由18个字符组成,detect.match(pat).group(2)^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

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

Nota Bene

在Python 2中,类型r'^Six o\'clock\nJim'是有限的字符集类型 它是文件的已读内容的类型,也可以使用模式detect.match(pat).group(2)和模式<type 'str'>一起打开。

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

然后,我认为上面的代码在Python 3中和在Python 2中一样好用,所以这样的文件以模式<class 'bytes'>打开。

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

AFAIHU