我使用的是Python3。在我的应用程序中,可以直接输入正则表达式字符串,应用程序将使用它来匹配一些字符串。例如,用户可以输入\t+
。然而,我不能让它工作,因为我不能正确地将它转换为正确的正则表达式。我试过了,下面是我的代码。
>>> import re
>>> re.compile(re.escape("\t+")).findall(" ")
[]
但是,当我将正则表达式字符串更改为\t
时,它将起作用。
>>> re.compile(re.escape("\t")).findall(" ")
['\t']
注意,findall
的参数是制表符。我不知道为什么它在Stackoverflow中看起来不能正确显示。
有人能给我指出解决这个问题的正确方向吗?谢谢。
发布于 2018-08-05 12:08:53
re.escape("\t+")
的结果是'\\\t\\+'
。请注意,+号是用反斜杠转义的,不再是特殊字符。这并不意味着“一个或多个选项卡”。
发布于 2018-08-06 06:32:38
来自外部源的文字\t+
与文字字符串"\t+"
不是一回事。print("\t+")
会输出什么?那print(r"\t+")
呢?后者等同于接受该文字字符串作为输入以用作正则表达式。前者不是。但是,对于这种特定情况,区别并不重要,因为字面制表符的行为应该与正则表达式中的\t
完全相同。思考来自Ipython会话的以下示例:
In [24]: re.compile('\t+').findall('^I')
Out[24]: ['\t']
In [25]: re.compile('\t+').findall("\t")
Out[25]: ['\t']
In [26]: re.compile(r'\t+').findall('^I')
Out[26]: ['\t']
In [27]: re.compile(r'\t+').findall("\t")
Out[27]: ['\t']
In [28]: re.compile(r'\t+').findall(r"\t")
Out[28]: []
我只能总结你的第一个例子,没有产生预期输出的那个例子,在引用的字符串中没有文字制表符。
此外,re.escape()
也不适合这种情况。它的目的是确保来自不受信任来源的字符串被逐字处理,而不是正则表达式,这样它就可以安全地用作要匹配的文字字符串。
https://stackoverflow.com/questions/51691270
复制相似问题