首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何找到正则表达式是否包含非转义元字符?

如何找到正则表达式是否包含非转义元字符?
EN

Stack Overflow用户
提问于 2016-02-23 14:52:34
回答 2查看 215关注 0票数 4

我有一个正则表达式列表,我想从中提取与字符串比较等价的正则表达式。

例如,这些正则表达式等价于一个简单的字符串比较:

代码语言:javascript
复制
[r"example",   # No metacharacters
 r"foo\.bar"]  # . is not a metacharacter because it is escaped

虽然这些规则不是:

代码语言:javascript
复制
[r"e.ample",   # . is a metacharacter
 r"foo\\.bar"] # . is a metacharacter because it is not escaped

根据https://docs.python.org/2/howto/regex.html,有效元字符的列表是. ^ $ * + ? { } [ ] \ | ( )

我正要构建一个正则表达式,但看起来有点复杂。我想知道是否有通过检查re对象或其他什么的快捷方式。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-23 16:01:09

受Keith评论的启发,这里有一个基于Python regex编译器的无文档特性的解决方案:

代码语言:javascript
复制
import re, sys, io

def contains_meta(regex):
    stdout = sys.stdout            # remember stdout
    sys.stdout = io.StringIO()     # redirect stdout to string
    re.compile(regex, re.DEBUG)    # compile the regex for the debug tree side effect
    output = sys.stdout.getvalue() # get that debug tree
    sys.stdout = stdout            # restore stdout
    return not all(line.startswith("LITERAL ") for line in output.strip().split("\n"))

输出:

代码语言:javascript
复制
In [9]: contains_meta(r"example")
Out[9]: False

In [10]: contains_meta(r"ex.mple")
Out[10]: True

In [11]: contains_meta(r"ex\.mple")
Out[11]: False

In [12]: contains_meta(r"ex\\.mple")
Out[12]: True

In [13]: contains_meta(r"ex[.]mple")  # single-character charclass --> literal
Out[13]: False

In [14]: contains_meta(r"ex[a-z]mple")
Out[14]: True

In [15]: contains_meta(r"ex[.,]mple")
Out[15]: True
票数 6
EN

Stack Overflow用户

发布于 2016-02-23 20:05:24

下面是一个正则表达式,可以用来检测python中的非转义元字符

代码语言:javascript
复制
>>> rex = re.compile(r'^([^\\]*)(\\.[^.^$*+?{}\[\]|()\\]*)*[.^$*+?{}\[\]|()]',re.MULTILINE)

>>> arr = [r"example", r"foo\.bar", r"e.ample", r"foo\\.bar", r"foo\\bar\.baz"]

>>> for s in arr:
...     print s, re.search(rex, s) != None
...

上面的regex使用\扫描输入的任何转义,然后忽略\旁边的字符。最后,它搜索一个元字符,该元字符是:

代码语言:javascript
复制
. ^ $ * + ? { } [ ] | ( ) \ ]

没有前面的\的字符。

输出:

代码语言:javascript
复制
example False
foo\.bar False
e.ample True
foo\\.bar True
foo\\bar\.baz False

Code Demo

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

https://stackoverflow.com/questions/35580689

复制
相关文章

相似问题

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