Python 从文件中读取正则表达式并避免或撤消转义
我想从文件中读取正则表达式,其中每行包含一个正则表达式:Python 从文件中读取正则表达式并避免或撤消转义,python,regex,python-3.x,escaping,Python,Regex,Python 3.x,Escaping,我想从文件中读取正则表达式,其中每行包含一个正则表达式: lorem.* dolor\S* 下面的代码应该读取每个字符串并将其附加到正则表达式字符串列表中: vocabulary=[] with open(path, "r") as vocabularyFile: for term in vocabularyFile: term = term.rstrip() vocabulary.append(term) 此代码似乎将文件中的\特殊字符转义为\。如何
lorem.*
dolor\S*
下面的代码应该读取每个字符串并将其附加到正则表达式字符串列表中:
vocabulary=[]
with open(path, "r") as vocabularyFile:
for term in vocabularyFile:
term = term.rstrip()
vocabulary.append(term)
此代码似乎将文件中的\
特殊字符转义为\
。如何避免对字符串进行转义或取消转义,使其可以像编写此代码一样进行处理
regex = r"dolor\S*"
您会因为重复该值而感到困惑。Python解释器通过打印
repr()
函数结果来回显值,这确保转义任何元字符:
>>> regex = r"dolor\S*"
>>> regex
'dolor\\S*'
regex
仍然是8个字符的字符串,而不是9个字符,索引5处的单个字符是单个反斜杠:
>>> regex[4]
'r'
>>> regex[5]
'\\'
>>> regex[6]
'S'
打印字符串会逐字写出所有字符,因此不会发生转义:
>>> print(regex)
dolor\S*
同样的过程也适用于容器的内容,如列表
或目录
:
>>> container = [regex, 'foo\nbar']
>>> print(container)
['dolor\\S*', 'foo\nbar']
注意,我没有在那里回音,而是打印出来的str(列表对象)
产生与这里的repr(列表对象)
相同的输出
如果要打印列表中的单个元素,将再次获得相同的未缩放结果:
>>> print(container[0])
dolor\S*
>>> print(container[1])
foo
bar
请注意第二个元素中的\n
现在是如何作为换行符写出的。正是由于这个原因,容器使用repr()
作为内容物;使难以检测或无法打印的数据可见
换句话说,这里的字符串不包含转义字符串。这只是一个可视的东西,字符串没有转义。通过在REPL中键入
r“dolor\S*”
进行验证(随后还会显示'dolor\\S*'
)。此代码将文件中的\special字符转义为\\。不,没有。如果您回显该值,Python解释器会将该值表示为'dolor\\S*”
,以使其可复制,但这不是一回事。当您显示正则表达式时,您会看到“\\”,但它只是“\”字符的表示。不需要取消任何IMHO的scape。如果您回显您创建的regex
示例字符串,您将看到它在回显时也被转义。