Python - 从.txt获取正则表达式

时间:2012-12-14 15:27:23

标签: python regex

如何在Python中打开.txt文件并获取文件中的确切字符串?

我有一个包含正则表达式的文本文件,例如:

\\*(.*?)\\n

当我在Python中打开文件时:

open('regEx.txt', 'r')

我得到了:

\\\\*(.*?)\\\\n

有没有办法打开这个文件,并获得与文件中​​写的完全一致的字符串?

3 个答案:

答案 0 :(得分:3)

您最有可能获得与文件中​​的数据完全相同的数据(除了行结尾,但这不是问题)。问题在于显示该数据。你在shell工作吗?它会输出转义序列,除非您明确使用print

尝试print open('regEx.txt', 'rb').read()甚至open('regEx2.txt','wb').write(open('regEx.txt', 'rb').read())。 regEx2.txt与regEx.txt相同。

答案 1 :(得分:2)

你在这里稍微混淆了一些字符串表示。实际的正则表达式(忽略任何语言特定的奇怪性)将只是

\*(.*?)\n

(字面意思是那9个字符)

但是,我想你已经使用过没有原始字符串的Java或Python。在这种情况下,要在内存中创建上面的字符串,你的代码必须加倍反斜杠:

"\\*(.*?)\\n"

这是因为,如果你没有将它们加倍,Python在编译字符串时就已经删除了它们。但现在字符串再次编译为这9个字符:\*(.*?)\n。如果将它们打印出来,你会得到(如jd。所说)包括双反斜杠的显示器。但是,如果您致电len(string),则会说9,而不是11

所以你只想要9个字符。那你为什么在你的文件中写11?如果你写了11,那么在显示时,反斜杠将再次被双重转义。但请在len(input)的结果上调用open。它会说11,而不是15

这也是为什么在代码中定义正则表达式时应始终使用原始字符串的原因。然后你永远不需要任何额外的转义(引号除外):

r"\*(.*?)\n"

将再次为您留下9个字符(因为在编译字符串时,反斜杠保持不变)。

答案 2 :(得分:0)

我不认为这是一个问题,请比较以下内容:

»»» regex # as read from the file
Out[9]: '\\*(.*?)\\n\n'

»»» r=r'\*(.*?)\n'

»»» r
Out[11]: '\\*(.*?)\\n'

除了换行符(这是我的错,我把它放在文件中),它们在内部是相同的。