首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python用户输入为正则表达式,如何正确操作?

Python用户输入为正则表达式,如何正确操作?
EN

Stack Overflow用户
提问于 2018-08-05 12:00:09
回答 2查看 6.8K关注 0票数 4

我使用的是Python3。在我的应用程序中,可以直接输入正则表达式字符串,应用程序将使用它来匹配一些字符串。例如,用户可以输入\t+。然而,我不能让它工作,因为我不能正确地将它转换为正确的正则表达式。我试过了,下面是我的代码。

>>> import re
>>> re.compile(re.escape("\t+")).findall("  ")
[]

但是,当我将正则表达式字符串更改为\t时,它将起作用。

>>> re.compile(re.escape("\t")).findall("   ")
['\t']

注意,findall的参数是制表符。我不知道为什么它在Stackoverflow中看起来不能正确显示。

有人能给我指出解决这个问题的正确方向吗?谢谢。

EN

回答 2

Stack Overflow用户

发布于 2018-08-05 12:08:53

re.escape("\t+")的结果是'\\\t\\+'。请注意,+号是用反斜杠转义的,不再是特殊字符。这并不意味着“一个或多个选项卡”。

票数 1
EN

Stack Overflow用户

发布于 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()也不适合这种情况。它的目的是确保来自不受信任来源的字符串被逐字处理,而不是正则表达式,这样它就可以安全地用作要匹配的文字字符串。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51691270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档