Python正则表达式模块使用BRE还是ERE?
POSIX似乎将正则表达式实现分为两类:基本正则表达式(BRE)和扩展正则表达式(ERE)Python正则表达式模块使用BRE还是ERE?,python,regex,posix,Python,Regex,Posix,POSIX似乎将正则表达式实现分为两类:基本正则表达式(BRE)和扩展正则表达式(ERE) Python参考似乎没有指定。除了语法上的一些相似之处,remodule不遵循正则表达式的POSIX标准 不同匹配语义 POSIX正则表达式(可通过DFA/NFA甚至回溯引擎实现)始终查找最左边最长的匹配,而re模块是一个回溯引擎,它查找最左边的“最早”匹配(“最早”根据正则表达式定义的搜索顺序) 在匹配(Prefix | PrefixSuffix)与PrefixSuffix的情况下,可以观察到匹配语义的
Python参考似乎没有指定。除了语法上的一些相似之处,
re
module不遵循正则表达式的POSIX标准
不同匹配语义
POSIX正则表达式(可通过DFA/NFA甚至回溯引擎实现)始终查找最左边最长的匹配,而re
模块是一个回溯引擎,它查找最左边的“最早”匹配(“最早”根据正则表达式定义的搜索顺序)
在匹配(Prefix | PrefixSuffix)
与PrefixSuffix
的情况下,可以观察到匹配语义的差异
- 在POSIX正则表达式的POSIX实现中(不是那些仅借用语法的实现),正则表达式将匹配
前缀suffix
- 相反,
引擎(以及许多其他回溯正则表达式引擎)将只匹配re
,因为前缀
是在替换中首先指定的前缀
(xxx | xxxxx)*
与xxxxxxxxx
(10个x
的字符串)进行匹配的情况下,也可以看出差异:
- 关于Cygwin:
所有10个$ [[ "xxxxxxxxxx" =~ (xxx|xxxxx)* ]] && echo "${BASH_REMATCH[0]}" xxxxxxxxxx
都匹配x
- 在Python中:
只匹配了9个>>> re.search(r'(?:xxx|xxxxx)*', 'xxxxxxxxxxx').group(0) 'xxxxxxxxx'
,因为它在所有3次重复中选择交替x
中的第一个项目,并且没有任何东西强迫它回溯并尝试交替中的第二个项目)xxx
“[=”
和“=]”
)分隔符内来表示例如,如果'a'
、'a'
和'a'
属于同一个等价类,那么“[[=a=]b]”
、“[[[=a=]b]”
”[[=a=]b]“都与“[aáb]”等价。[……]
由于这些特性严重依赖于语言环境设置,因此同一个正则表达式在不同的语言环境中的行为可能不同。排序顺序还取决于系统上的区域设置数据
re
正则表达式功能
re
借用了Perl的语法,但并非Perl正则表达式中的所有功能都是在re
中实现的。以下是re
中可用的一些正则表达式功能,这些功能在POSIX正则表达式中不可用:
- 贪婪/懒惰量词,指定扩展量词的顺序
虽然人们通常称POSIX中的
*
为贪婪,但实际上它只指定POSIX中重复的下限和上限。所谓的“贪婪”行为是由于最左边的最长匹配规则
- 环顾断言(向前看和向后看)
- 条件模式
(?(id/name)是模式|否模式)
- 简写构造:
\b
,\s
,\d
,\w
(一些POSIX正则表达式引擎可能会实现这些构造,因为标准没有为这些情况定义行为)
都不是。它基本上是PCRE方言,但却是一个独特的实现
re
文档中的第一句话是:
此模块提供与Perl中类似的正则表达式匹配操作
虽然这不会立即向新手揭示它们与POSIX正则表达式的关系,但众所周知,Perl 4和更高版本的Perl 5提供了比早期工具的正则表达式功能大幅度扩展的功能集,包括POSIX为grep-e
所规定的功能集
本文更详细地描述了正则表达式特性,尽管在Python文档中您会以不同的形式找到许多相同的细节。Perl手册页面包含以下历史信息:
Perl模式匹配中使用的模式是从Version8正则表达式例程中提供的模式演变而来的。(这些例程是从亨利·斯宾塞(Henry Spencer)对V8例程的可自由再发行的重新实现中衍生出来的(遥远的)
(这里,V8基本上是指.Spencer的库。)
Perl 4有大量方便的构造,如\d
,\s
,\w
,以及符号速记,如\t
,\f
,\n
。Perl 5添加了一组重要的扩展(仍在缓慢增长),包括但不限于:
- 非贪婪量词
- 非回溯量词
- Unicode符号和属性支持
- 非分组括号
- 向前看和向后看
- 。。。基本上是以
(?
因此,“正则”表达式不再是严格意义上的“正则”
这是由Philip Hazell在一个便携库中重新实现的,最初用于Exim邮件服务器;他已经在无数不同的应用程序中找到了自己的方法,包括许多编程语言(Ruby、PHP、Python等)